summaryrefslogtreecommitdiff
path: root/telepathy-glib/proxy-signals.c
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2008-03-06 16:54:05 +0000
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2008-03-06 16:54:05 +0000
commite0dbc08ad102b43066a6a9d9b5a31f1121ac4081 (patch)
tree624de048b0e0971ea4d9e2044378e94123fab72d /telepathy-glib/proxy-signals.c
parentfd93ba9fa4a4c3d543149a7dc255a3e4363ca62d (diff)
downloadtelepathy-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.c21
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;