Snippet content copied to clipboard.
Are you sure to delete this snippet? No, don't delete
  1. #include <gio/gio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. gpointer current_data = NULL;
  5. GMutex data_mutex;
  6. GCond data_cond;
  7. void push_data(gpointer data) {
  8. g_mutex_lock(&data_mutex);
  9. current_data = data;
  10. g_cond_signal(&data_cond);
  11. g_mutex_unlock(&data_mutex);
  12. }
  13. gpointer pop_data_timed(void) {
  14. gint64 end_time;
  15. gpointer data;
  16. g_print("start timer:\t%ld\n", g_get_monotonic_time());
  17. g_mutex_lock(&data_mutex);
  18. end_time = g_get_monotonic_time() + 5 * G_TIME_SPAN_SECOND;
  19. g_print("wait until:\t%ld\n", end_time);
  20. while (!current_data)
  21. if (!g_cond_wait_until(&data_cond, &data_mutex, end_time)) {
  22. g_print("timeout:\t%ld\n", g_get_monotonic_time());
  23. // timeout has passed.
  24. g_mutex_unlock(&data_mutex);
  25. return NULL;
  26. }
  27. // there is data for us
  28. data = current_data;
  29. current_data = NULL;
  30. g_mutex_unlock(&data_mutex);
  31. return data;
  32. }
  33. int main(int argc, char **argv) {
  34. GApplication *app;
  35. int status;
  36. app = g_application_new("org.gtk.TestApplication", G_APPLICATION_HANDLES_COMMAND_LINE);
  37. g_signal_connect(app, "command-line", G_CALLBACK(pop_data_timed), NULL);
  38. g_application_set_inactivity_timeout(app, 10000);
  39. status = g_application_run(app, argc, argv);
  40. g_object_unref(app);
  41. return status;
  42. }

Edit this Snippet