gboolean my_callback(int* data) { static int i = 100; int depth; //checks g_main_loop_is_running g_assert(g_main_loop_is_running(loop)); depth = g_main_depth(); //checks g_main_depth g_assert(depth == 1); i--; //printf("%d\n",i); if(i<0) { e1_complete = TRUE; quit(); return FALSE; } else { ++(*data); return TRUE; } }
static void gimp_dialog_dispose (GObject *object) { GdkDisplay *display = NULL; if (g_main_depth () == 0) { display = gtk_widget_get_display (GTK_WIDGET (object)); g_object_ref (display); } G_OBJECT_CLASS (parent_class)->dispose (object); if (display) { gdk_display_flush (display); g_object_unref (display); } }
void GlibEvents::process() { if( !checkedEventLoop ) { // If Qt is already running a Glib event loop, disable our own's timer if (QLatin1String(QAbstractEventDispatcher::instance()->metaObject()->className()) == "QGuiEventDispatcherGlib") { kDebug(1430) << "Qt already providing Glib integration, dropping ours"; timer.stop(); } else kDebug(1430) << "Qt using pure Xlib event loop; keeping Glib integration active"; checkedEventLoop = true; } if( g_main_depth() > 0 ) return; // avoid reentrancy when Qt's Glib integration is used while( g_main_context_pending( g_main_context_default())) g_main_context_iteration( g_main_context_default(), false ); }
void main_loop_test() { GMainContext *default_context; int depth; int id; GTimeVal time ={0,}; int user_data = 0,fd_data = 0; GPollFD pollfd; GSource *source3; GSourceFuncs SourceFuncs = { prepare, check, dispatch, NULL }; GSourceFuncs fd_SourceFuncs = { fd_prepare, fd_check, fd_dispatch, NULL }; e1_complete = FALSE; e2_complete = FALSE; pipe(fd); pollfd.fd = fd[0]; pollfd.events = G_IO_IN | G_IO_HUP | G_IO_ERR; pollfd.revents = 0; pthread_create(&thread1, NULL, thread_function, NULL); context = g_main_context_new(); //g_main_context_add_poll(context,&pollfd,0); source1 = g_source_new(&SourceFuncs,sizeof(GSource)); g_source_set_callback(source1,(GSourceFunc)my_callback,&user_data,NULL); id = g_source_attach(source1,context); g_assert(g_source_get_id(source1) == id); g_source_set_priority(source1,0); g_assert(g_source_get_priority(source1) == 0); loop = g_main_loop_new(context, FALSE); default_context = g_main_loop_get_context(loop); //checks g_main_loop_get_context g_assert(default_context == context); //checks g_main_loop_is_running g_assert(g_main_loop_is_running(loop) == FALSE); depth = g_main_depth(); //checks g_main_depth g_assert(depth == 0); g_source_get_current_time(source1,&time); g_assert(time.tv_usec > 0); g_source_set_can_recurse(source1,TRUE); g_assert(g_source_get_can_recurse(source1) == TRUE); source2 = g_source_new(&fd_SourceFuncs,sizeof(GSource)); g_source_set_callback(source2,(GSourceFunc)fd_callback,&fd_data,NULL); g_source_add_poll(source2,&pollfd); g_source_remove_poll(source2,&pollfd); // checks g_source_remove_poll g_assert(source2->poll_fds == NULL); g_source_add_poll(source2,&pollfd); // checks whether g_source_add_poll is successful. // one more check is done in fd_callback. // If that function is callled we are sure that add poll was successful g_assert(source2->poll_fds->data == &pollfd); source3 = g_source_ref(source2); g_assert(source3 == source2 && source2->ref_count == 2); g_source_unref(source3); id = g_source_attach(source2,context); //checks g_main_context_pending g_assert(g_main_context_pending(context)); g_main_loop_run(loop); // ref is called here. Thats why two unrefs are called. If the 2nd unref is // callled with the unref, code should crash g_main_loop_ref(loop); g_main_loop_unref(loop); g_main_loop_unref(loop); //checks the number of times the call back function is called g_assert(user_data == 100); // checks whether set poll was successful and call back for the same // was called g_assert(fd_data == 1); }