Thursday, 8 December 2016

Re: cups-browsed uses GMainLoop and global variables, how to introduce locks against race conditions?

On Wed, 2016-12-07 at 17:39 -0200, Till Kamppeter wrote:
On 12/02/2016 04:13 PM, Till Kamppeter wrote:  
The way how cups-browsed works is the following: First, a GMainLoop is created: gmainloop = g_main_loop_new (NULL, FALSE); Browsing for legacy CUPS broadcasts is attached to the mail loop via GIOChannel *browse_channel = g_io_channel_unix_new (browsesocket); g_io_channel_set_close_on_unref (browse_channel, FALSE); g_io_add_watch (browse_channel, G_IO_IN, process_browse_data, NULL); Many other things are added via g_idle_add () and g_timeout_add_seconds () Reaction to D-Bus notifications is added via the g_signal_connect() function. Avahi browsing is set up with these calls /* Allocate main loop object */ if (!glib_poll) if (!(glib_poll = avahi_glib_poll_new(NULL, G_PRIORITY_DEFAULT))) { debug_printf("ERROR: Failed to create glib poll object.\n"); goto avahi_init_fail; } /* Allocate a new client */ if (!client) client = avahi_client_new(avahi_glib_poll_get(glib_poll), AVAHI_CLIENT_NO_FAIL, client_callback, NULL, &error); /* Check wether creating the client object succeeded */ if (!client) { debug_printf("ERROR: Failed to create client: %s\n", avahi_strerror(error)); goto avahi_init_fail; } Strange is that this Avahi browsing setup is done before creation of the main loop. Also some g_timeout_add_seconds () calls are done before creating the main loop. After that, the main loop gets started via g_main_loop_run (gmainloop); My questions are now: - Is this way everything attached to the main loop? - Do I have to do function calls in the beginning and in the end of each callback function to acquire and release a lock? Which ones? - If something of this is not attached to the main loop, how do I attach it? I do not explicitly start any new threads. Till
No one has any idea to help me here?

If there are no threads, then there isn't any locking needed on the data structure, so it's probably something else that is causing your problem. But you're probably out of mailing list territory at this point, need a way to recreate and to find someone who has time to look through the code.