]> git.0d.be Git - empathy.git/commitdiff
Drop our references in dispose instead of finalize.
authorXavier Claessens <xclaesse@src.gnome.org>
Tue, 6 Jan 2009 16:48:19 +0000 (16:48 +0000)
committerXavier Claessens <xclaesse@src.gnome.org>
Tue, 6 Jan 2009 16:48:19 +0000 (16:48 +0000)
svn path=/trunk/; revision=2069

libempathy/empathy-contact-monitor.c

index e48f0865555f3ceed8ea20bfc9d7d983c7adcdf5..b024e1b86b5d8914c57ef686b978377d3cbeb891 100644 (file)
@@ -35,6 +35,8 @@
 typedef struct {
   EmpathyContactList *proxy;
   GPtrArray *contacts;
+
+  gboolean dispose_run;
 } EmpathyContactMonitorPriv;
 
 enum {
@@ -111,8 +113,6 @@ do_finalize (GObject *obj)
   priv = GET_PRIV (obj);
 
   if (priv->contacts) {
-    g_ptr_array_foreach (priv->contacts,
-                         (GFunc) contact_remove_foreach, obj);
     g_ptr_array_free (priv->contacts, TRUE);
     priv->contacts = NULL;
   }
@@ -125,12 +125,39 @@ do_finalize (GObject *obj)
   G_OBJECT_CLASS (empathy_contact_monitor_parent_class)->finalize (obj);
 }
 
+static void
+do_dispose (GObject *obj)
+{
+  EmpathyContactMonitorPriv *priv;
+
+  priv = GET_PRIV (obj);
+
+  if (priv->dispose_run) {
+    return;
+  }
+
+  if (priv->contacts) {
+    g_ptr_array_foreach (priv->contacts,
+                         (GFunc) contact_remove_foreach, obj);
+  }
+
+  if (priv->proxy) {
+    g_signal_handlers_disconnect_by_func (priv->proxy,
+                                          cl_members_changed_cb, obj);
+  }
+
+  priv->dispose_run = TRUE;
+
+  G_OBJECT_CLASS (empathy_contact_monitor_parent_class)->dispose (obj);
+}
+
 static void
 empathy_contact_monitor_class_init (EmpathyContactMonitorClass *klass)
 {
   GObjectClass *oclass = G_OBJECT_CLASS (klass);
 
   oclass->finalize = do_finalize;
+  oclass->dispose = do_dispose;
   oclass->get_property = do_get_property;
   oclass->set_property = do_set_property;
 
@@ -225,6 +252,7 @@ empathy_contact_monitor_init (EmpathyContactMonitor *self)
   self->priv = priv;
   priv->contacts = NULL;
   priv->proxy = NULL;
+  priv->dispose_run = FALSE;
 }
 
 static void