[folks] Disconnect from 'invalidated' on proxies we abandon.
- From: Travis Reitter <treitter src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [folks] Disconnect from 'invalidated' on proxies we abandon.
- Date: Wed, 23 Mar 2011 15:51:23 +0000 (UTC)
commit 8b2801701348486ac760ae2044197538f8fb366c
Author: Travis Reitter <travis reitter collabora co uk>
Date: Fri Mar 18 12:07:42 2011 -0700
Disconnect from 'invalidated' on proxies we abandon.
This prevents a crasher in the Telepathy backend where:
1. We hit _reset() and set this._subscribe, etc., to null.
2. Each of these proxies gets disposed and emits 'invalidated'
3. Our 'invalidated' handler ends up unrefing each proxy an extra time, which
ends up in some ugly dispose -> unref -> dispose recursion, which continues
after it's finalized, leading to bad/undefined behavior (usually, but not
always, a crasher).
NEWS | 1 +
backends/telepathy/lib/tpf-persona-store.vala | 32 ++++++++++++++++++++++--
2 files changed, 30 insertions(+), 3 deletions(-)
---
diff --git a/NEWS b/NEWS
index 85e56e4..817db46 100644
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,7 @@ Bugs fixed:
* Bug 645430 - folks-inspect: Use LinkedHashSet to access im-addresses
* Bug 645411 - folks-import segfaults on startup
* Crasher when removing Personas
+* Crasher when reconnecting a Telepathy account
Overview of changes from libfolks 0.3.6 to libfolks 0.4.0
=========================================================
diff --git a/backends/telepathy/lib/tpf-persona-store.vala b/backends/telepathy/lib/tpf-persona-store.vala
index 1049bb1..c537fdc 100644
--- a/backends/telepathy/lib/tpf-persona-store.vala
+++ b/backends/telepathy/lib/tpf-persona-store.vala
@@ -212,11 +212,37 @@ public class Tpf.PersonaStore : Folks.PersonaStore
this._group_outgoing_adds = new HashMap<string, HashSet<Tpf.Persona>> ();
this._group_outgoing_removes = new HashMap<string, HashSet<Tpf.Persona>> (
);
- this._publish = null;
- this._stored = null;
- this._subscribe = null;
+
+ if (this._publish != null)
+ {
+ this._publish.invalidated.disconnect (this._channel_invalidated_cb);
+ this._publish = null;
+ }
+
+ if (this._stored != null)
+ {
+ this._stored.invalidated.disconnect (this._channel_invalidated_cb);
+ this._stored = null;
+ }
+
+ if (this._subscribe != null)
+ {
+ this._subscribe.invalidated.disconnect (this._channel_invalidated_cb);
+ this._subscribe = null;
+ }
+
this._standard_channels_unready = new HashMap<string, Channel> ();
this._group_channels_unready = new HashMap<string, Channel> ();
+
+ if (this._groups != null)
+ {
+ foreach (var channel in this._groups.values)
+ {
+ if (channel != null)
+ channel.invalidated.disconnect (this._channel_invalidated_cb);
+ }
+ }
+
this._groups = new HashMap<string, Channel> ();
this._favourite_handles = new HashSet<uint> ();
this._ll = new TpLowlevel ();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]