[glib/gdbus-daemon] gdbusdaemon: Fix refcounting of connection
- From: Alexander Larsson <alexl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/gdbus-daemon] gdbusdaemon: Fix refcounting of connection
- Date: Mon, 16 Apr 2012 20:10:11 +0000 (UTC)
commit bc2dcfd6ade28dea1652e9125b5925cedb8aff63
Author: Alexander Larsson <alexl redhat com>
Date: Mon Apr 16 21:37:10 2012 +0200
gdbusdaemon: Fix refcounting of connection
Don't leak refs via not unexporting on the skeleton.
Also clean up the code a bit
gio/gdbusdaemon.c | 38 +++++++++++++++++++++++---------------
1 files changed, 23 insertions(+), 15 deletions(-)
---
diff --git a/gio/gdbusdaemon.c b/gio/gdbusdaemon.c
index d578610..5772f76 100644
--- a/gio/gdbusdaemon.c
+++ b/gio/gdbusdaemon.c
@@ -112,6 +112,14 @@ typedef struct {
MatchElement *elements;
} Match;
+static GDBusMessage *filter_function (GDBusConnection *connection,
+ GDBusMessage *message,
+ gboolean incoming,
+ gpointer user_data);
+static void connection_closed (GDBusConnection *connection,
+ gboolean remote_peer_vanished,
+ GError *error,
+ Client *client);
static NameOwner *
name_owner_new (Client *client, guint32 flags)
@@ -789,11 +797,12 @@ static Client *
client_new (GDBusDaemon *daemon, GDBusConnection *connection)
{
Client *client;
+ GError *error = NULL;
client = g_new0 (Client, 1);
client->daemon = daemon;
client->id = g_strdup_printf (":%d.%d", daemon->next_major_id, daemon->next_minor_id);
- client->connection = connection;
+ client->connection = g_object_ref (connection);
if (daemon->next_minor_id == G_MAXUINT32)
{
@@ -806,6 +815,15 @@ client_new (GDBusDaemon *daemon, GDBusConnection *connection)
g_object_set_data (G_OBJECT (connection), "client", client);
g_hash_table_insert (daemon->clients, client->id, client);
+ g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (daemon), connection,
+ "/org/freedesktop/DBus", &error);
+ g_assert_no_error (error);
+
+ g_signal_connect (connection, "closed", G_CALLBACK (connection_closed), client);
+ g_dbus_connection_add_filter (connection,
+ filter_function,
+ client, NULL);
+
send_name_owner_changed (daemon, client->id, NULL, client->id);
return client;
@@ -817,6 +835,9 @@ client_free (Client *client)
GDBusDaemon *daemon = client->daemon;
GList *l, *names;
+ g_dbus_interface_skeleton_unexport_from_connection (G_DBUS_INTERFACE_SKELETON (daemon),
+ client->connection);
+
g_hash_table_remove (daemon->clients, client->id);
names = g_hash_table_get_values (daemon->names);
@@ -853,7 +874,6 @@ connection_closed (GDBusConnection *connection,
GError *error,
Client *client)
{
- g_print ("connection %s closed %d %s\n", client->id, remote_peer_vanished, error->message);
client_free (client);
}
@@ -1437,22 +1457,10 @@ on_new_connection (GDBusServer *server,
gpointer user_data)
{
GDBusDaemon *daemon = user_data;
- GError *error = NULL;
- Client *client;
-
- client = client_new (daemon, connection);
- g_object_ref (connection);
g_dbus_connection_set_exit_on_close (connection, FALSE);
- g_signal_connect (connection, "closed", G_CALLBACK (connection_closed), client);
-
- g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (daemon), connection,
- "/org/freedesktop/DBus", &error);
- g_assert_no_error (error);
- g_dbus_connection_add_filter (connection,
- filter_function,
- client, NULL);
+ client_new (daemon, connection);
return TRUE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]