diff options
author | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2008-03-06 16:54:05 +0000 |
---|---|---|
committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2008-03-06 16:54:05 +0000 |
commit | e0dbc08ad102b43066a6a9d9b5a31f1121ac4081 (patch) | |
tree | 624de048b0e0971ea4d9e2044378e94123fab72d /telepathy-glib/proxy-signals.c | |
parent | fd93ba9fa4a4c3d543149a7dc255a3e4363ca62d (diff) | |
download | telepathy-glib-e0dbc08ad102b43066a6a9d9b5a31f1121ac4081.tar.gz |
proxy-signals.c: clear the TpProxySignalConnection's weak reference when a proxy is invalidated, and give each TpProxySignalInvocation its own strong reference instead (fd.o #14854)
20080306165405-53eee-9d04c5405aa208315334548908da4e3beac9a213.gz
Diffstat (limited to 'telepathy-glib/proxy-signals.c')
-rw-r--r-- | telepathy-glib/proxy-signals.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/telepathy-glib/proxy-signals.c b/telepathy-glib/proxy-signals.c index 672af0039..38db32664 100644 --- a/telepathy-glib/proxy-signals.c +++ b/telepathy-glib/proxy-signals.c @@ -40,6 +40,7 @@ typedef struct _TpProxySignalInvocation TpProxySignalInvocation; struct _TpProxySignalInvocation { TpProxySignalConnection *sc; + TpProxy *proxy; GValueArray *args; guint idle_source; }; @@ -104,6 +105,10 @@ tp_proxy_signal_connection_proxy_invalidated (TpProxy *proxy, sc->proxy, message); g_assert (proxy == sc->proxy); + g_signal_handlers_disconnect_by_func (sc->proxy, + tp_proxy_signal_connection_proxy_invalidated, sc); + sc->proxy = NULL; + tp_proxy_signal_connection_disconnect_dbus_glib (sc); } @@ -199,7 +204,8 @@ tp_proxy_signal_connection_disconnect (TpProxySignalConnection *sc) while ((invocation = g_queue_pop_head (&sc->invocations)) != NULL) { g_assert (invocation->sc == sc); - g_object_unref (invocation->sc->proxy); + g_object_unref (invocation->proxy); + invocation->proxy = NULL; invocation->sc = NULL; g_source_remove (invocation->idle_source); @@ -223,10 +229,12 @@ tp_proxy_signal_invocation_free (gpointer p) g_warning ("%s: idle source removed by someone else", G_STRFUNC); g_queue_remove (&invocation->sc->invocations, invocation); - g_object_unref (invocation->sc->proxy); + g_object_unref (invocation->proxy); tp_proxy_signal_connection_unref (invocation->sc); } + g_assert (invocation->proxy == NULL); + if (invocation->args != NULL) g_value_array_free (invocation->args); @@ -244,7 +252,7 @@ tp_proxy_signal_invocation_run (gpointer p) MORE_DEBUG ("%p: popped %p", invocation->sc, popped); g_assert (popped == invocation); - invocation->sc->invoke_callback (invocation->sc->proxy, NULL, + invocation->sc->invoke_callback (invocation->proxy, NULL, invocation->args, invocation->sc->callback, invocation->sc->user_data, invocation->sc->weak_object); @@ -253,9 +261,10 @@ tp_proxy_signal_invocation_run (gpointer p) /* there's one ref to the proxy per queued invocation, to keep it * alive */ - MORE_DEBUG ("%p refcount-- due to %p run, sc=%p", invocation->sc->proxy, + MORE_DEBUG ("%p refcount-- due to %p run, sc=%p", invocation->proxy, invocation, invocation->sc); - g_object_unref (invocation->sc->proxy); + g_object_unref (invocation->proxy); + invocation->proxy = NULL; tp_proxy_signal_connection_unref (invocation->sc); invocation->sc = NULL; @@ -426,7 +435,7 @@ tp_proxy_signal_connection_v0_take_results (TpProxySignalConnection *sc, /* as long as there are queued invocations, we keep one ref to the TpProxy * and one ref to the TpProxySignalConnection per invocation */ MORE_DEBUG ("%p refcount++ due to %p, sc=%p", sc->proxy, invocation, sc); - g_object_ref (sc->proxy); + invocation->proxy = g_object_ref (sc->proxy); sc->refcount++; invocation->sc = sc; |