summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2003-09-22 23:50:52 +0000
committerHavoc Pennington <hp@redhat.com>2003-09-22 23:50:52 +0000
commit4be7b14fce835a30b312bfed1492234bf1e0f316 (patch)
tree201c4def0b593936959d64b47688dff395d349c8
parentf4cffc0e49d48a8dbf158230d7e816d8713566da (diff)
downloaddbus-4be7b14fce835a30b312bfed1492234bf1e0f316.tar.gz
2003-09-22 Havoc Pennington <hp@redhat.com>
* glib/dbus-gproxy.c (dbus_gproxy_manager_get): implement
-rw-r--r--ChangeLog4
-rw-r--r--glib/dbus-gproxy.c69
2 files changed, 56 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index 530c47c8..a094e98a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2003-09-22 Havoc Pennington <hp@redhat.com>
+
+ * glib/dbus-gproxy.c (dbus_gproxy_manager_get): implement
+
2003-09-21 Seth Nickell <seth@gnome.org>
First checkin of the Python bindings.
diff --git a/glib/dbus-gproxy.c b/glib/dbus-gproxy.c
index 96a27888..57cdab2f 100644
--- a/glib/dbus-gproxy.c
+++ b/glib/dbus-gproxy.c
@@ -37,28 +37,61 @@ typedef struct
{
GStaticMutex lock; /**< Thread lock */
int refcount; /**< Reference count */
-
+ DBusConnection *connection; /**< Connection we're associated with. */
} DBusGProxyManager;
-
/** Lock the DBusGProxyManager */
#define LOCK_MANAGER(mgr) (g_static_mutex_lock (&(mgr)->lock))
/** Unlock the DBusGProxyManager */
#define UNLOCK_MANAGER(mgr) (g_static_mutex_unlock (&(mgr)->lock))
+static int gproxy_manager_slot = -1;
+
+/* Lock controlling get/set manager as data on each connection */
+static GStaticMutex connection_gproxy_lock = G_STATIC_MUTEX_INIT;
+
+static void dbus_gproxy_manager_ref (DBusGProxyManager *manager);
+
static DBusGProxyManager*
-dbus_gproxy_manager_new (void)
+dbus_gproxy_manager_get (DBusConnection *connection)
{
DBusGProxyManager *manager;
+ dbus_connection_allocate_data_slot (&gproxy_manager_slot);
+ if (gproxy_manager_slot < 0)
+ g_error ("out of memory");
+
+ g_static_mutex_lock (&connection_gproxy_lock);
+
+ manager = dbus_connection_get_data (connection, gproxy_manager_slot);
+ if (manager != NULL)
+ {
+ dbus_connection_free_data_slot (&gproxy_manager_slot);
+ dbus_gproxy_manager_ref (manager);
+ g_static_mutex_unlock (&connection_gproxy_lock);
+ return manager;
+ }
+
manager = g_new0 (DBusGProxyManager, 1);
manager->refcount = 1;
+ manager->connection = connection;
g_static_mutex_init (&manager->lock);
+ /* Proxy managers keep the connection alive, which means that
+ * DBusGProxy indirectly does. To free a connection you have to free
+ * all the proxies referring to it.
+ */
+ dbus_connection_ref (manager->connection);
+
+ dbus_connection_set_data (connection, gproxy_manager_slot,
+ manager, NULL);
+
+ g_static_mutex_unlock (&connection_gproxy_lock);
+
return manager;
}
@@ -89,7 +122,18 @@ dbus_gproxy_manager_unref (DBusGProxyManager *manager)
g_static_mutex_free (&manager->lock);
+ g_static_mutex_lock (&connection_gproxy_lock);
+
+ dbus_connection_set_data (manager->connection,
+ gproxy_manager_slot,
+ NULL, NULL);
+
+ g_static_mutex_unlock (&connection_gproxy_lock);
+
+ dbus_connection_unref (manager->connection);
g_free (manager);
+
+ dbus_connection_free_data_slot (&gproxy_manager_slot);
}
else
{
@@ -97,14 +141,6 @@ dbus_gproxy_manager_unref (DBusGProxyManager *manager)
}
}
-static DBusGProxyManager*
-dbus_gproxy_manager_get_for_connection (DBusConnection *connection)
-{
- /* FIXME */
-
- return NULL;
-}
-
/**
* Internals of DBusGProxy
*/
@@ -112,7 +148,7 @@ struct DBusGProxy
{
GStaticMutex lock; /**< Thread lock */
int refcount; /**< Reference count */
- DBusConnection *connection; /**< Connection to communicate over */
+ DBusGProxyManager *manager; /**< Proxy manager */
char *service; /**< Service messages go to or NULL */
char *path; /**< Path messages go to or NULL */
char *interface; /**< Interface messages go to or NULL */
@@ -131,8 +167,7 @@ _dbus_gproxy_new (DBusConnection *connection)
proxy = g_new0 (DBusGProxy, 1);
proxy->refcount = 1;
- proxy->connection = connection;
- dbus_connection_ref (connection);
+ proxy->manager = dbus_gproxy_manager_get (connection);
g_static_mutex_init (&proxy->lock);
@@ -224,7 +259,7 @@ dbus_gproxy_unref (DBusGProxy *proxy)
{
UNLOCK_PROXY (proxy);
- dbus_connection_unref (proxy->connection);
+ dbus_gproxy_manager_unref (proxy->manager);
g_free (proxy->service);
g_free (proxy->path);
g_free (proxy->interface);
@@ -282,7 +317,7 @@ dbus_gproxy_begin_call (DBusGProxy *proxy,
goto oom;
va_end (args);
- if (!dbus_connection_send_with_reply (proxy->connection,
+ if (!dbus_connection_send_with_reply (proxy->manager->connection,
message,
&pending,
-1))
@@ -409,7 +444,7 @@ dbus_gproxy_send (DBusGProxy *proxy,
g_error ("Out of memory");
}
- if (!dbus_connection_send (proxy->connection, message, client_serial))
+ if (!dbus_connection_send (proxy->manager->connection, message, client_serial))
g_error ("Out of memory\n");
UNLOCK_PROXY (proxy);