[glib] GDBusServer: Avoid handling incoming connections after stop() has been called
- From: David Zeuthen <davidz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib] GDBusServer: Avoid handling incoming connections after stop() has been called
- Date: Tue, 20 Jul 2010 16:18:13 +0000 (UTC)
commit b3cf5cbd0bfcfe53f82a72d276683aebd15d3828
Author: David Zeuthen <davidz redhat com>
Date: Tue Jul 20 12:14:30 2010 -0400
GDBusServer: Avoid handling incoming connections after stop() has been called
Without this fix, we'd sometimes run code after stop() and finalize()
to handle incoming requests. This was observed in the gdbus-peer test
case occasionally crashing:
$ ./gdbus-peer
/gdbus/peer-to-peer: OK
/gdbus/delayed-message-processing: OK
/gdbus/nonce-tcp:
GLib-GObject-WARNING **: invalid uninstantiatable type `(null)' in cast to `GDBusServer'
aborting...
Signed-off-by: David Zeuthen <davidz redhat com>
gio/gdbusserver.c | 15 +++++++++++----
1 files changed, 11 insertions(+), 4 deletions(-)
---
diff --git a/gio/gdbusserver.c b/gio/gdbusserver.c
index abd464e..14f94a6 100644
--- a/gio/gdbusserver.c
+++ b/gio/gdbusserver.c
@@ -92,6 +92,7 @@ struct _GDBusServer
GSocketListener *listener;
gboolean is_using_listener;
+ gulong run_signal_handler_id;
/* The result of g_main_context_get_thread_default() when the object
* was created (the GObject _init() function) - this is used for delivery
@@ -158,6 +159,9 @@ g_dbus_server_finalize (GObject *object)
if (server->authentication_observer != NULL)
g_object_unref (server->authentication_observer);
+ if (server->run_signal_handler_id > 0)
+ g_signal_handler_disconnect (server->listener, server->run_signal_handler_id);
+
if (server->listener != NULL)
g_object_unref (server->listener);
@@ -489,10 +493,10 @@ g_dbus_server_new_sync (const gchar *address,
{
/* Right now we don't have any transport not using the listener... */
g_assert (server->is_using_listener);
- g_signal_connect (G_SOCKET_SERVICE (server->listener),
- "run",
- G_CALLBACK (on_run),
- server);
+ server->run_signal_handler_id = g_signal_connect (G_SOCKET_SERVICE (server->listener),
+ "run",
+ G_CALLBACK (on_run),
+ server);
}
return server;
@@ -605,6 +609,9 @@ g_dbus_server_stop (GDBusServer *server)
return;
/* Right now we don't have any transport not using the listener... */
g_assert (server->is_using_listener);
+ g_assert (server->run_signal_handler_id > 0);
+ g_signal_handler_disconnect (server->listener, server->run_signal_handler_id);
+ server->run_signal_handler_id = 0;
g_socket_service_stop (G_SOCKET_SERVICE (server->listener));
server->active = FALSE;
g_object_notify (G_OBJECT (server), "active");
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]