Fix D-Bus timeout handling
authorDaniel Orstadius <daniel.orstadius@gmail.com>
Wed, 16 Dec 2009 09:23:46 +0000 (11:23 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Thu, 17 Dec 2009 06:34:33 +0000 (22:34 -0800)
Timeouts should also be removed in the remove_timeout callback in
addition to the timeout_handler_free function. This is how dbus-glib
does it and it seems to prevent crashes in certain situations.

gdbus/mainloop.c

index bd775f8..7abdf47 100644 (file)
@@ -183,7 +183,11 @@ static void timeout_handler_free(void *data)
        if (!handler)
                return;
 
-       g_source_remove(handler->id);
+       if (handler->id > 0) {
+               g_source_remove(handler->id);
+               handler->id = 0;
+       }
+
        g_free(handler);
 }
 
@@ -207,6 +211,17 @@ static dbus_bool_t add_timeout(DBusTimeout *timeout, void *data)
 
 static void remove_timeout(DBusTimeout *timeout, void *data)
 {
+        timeout_handler_t *handler;
+
+        handler = dbus_timeout_get_data(timeout);
+
+        if (!handler)
+                return;
+
+        if (handler->id > 0) {
+                g_source_remove(handler->id);
+                handler->id = 0;
+        }
 }
 
 static void timeout_toggled(DBusTimeout *timeout, void *data)