[ekiga] Removed strange memory problems in the presence and contact cores (sigc::trackable was supposed to h



commit bebb3346b988c76c4d70272d7e4d035da47c3e06
Author: Julien Puydt <jpuydt gnome org>
Date:   Thu May 14 14:18:07 2009 +0200

    Removed strange memory problems in the presence and contact cores (sigc::trackable was supposed to handle that...)
---
 lib/engine/addressbook/contact-core.cpp |   14 ++++++++------
 lib/engine/addressbook/contact-core.h   |    6 ++++--
 lib/engine/presence/presence-core.cpp   |   22 ++++++++++++----------
 lib/engine/presence/presence-core.h     |    5 +++--
 4 files changed, 27 insertions(+), 20 deletions(-)

diff --git a/lib/engine/addressbook/contact-core.cpp b/lib/engine/addressbook/contact-core.cpp
index d0d405b..37ad750 100644
--- a/lib/engine/addressbook/contact-core.cpp
+++ b/lib/engine/addressbook/contact-core.cpp
@@ -48,6 +48,8 @@ on_search ()
 
 Ekiga::ContactCore::~ContactCore ()
 {
+  for (std::list<sigc::connection>::iterator iter = conns.begin (); iter != conns.end (); ++iter)
+    iter->disconnect ();
 }
 
 bool
@@ -75,12 +77,12 @@ Ekiga::ContactCore::add_source (SourcePtr source)
 {
   sources.push_back (source);
   source_added.emit (source);
-  source->book_added.connect (sigc::bind<0> (book_added.make_slot (), source));
-  source->book_removed.connect (sigc::bind<0> (book_removed.make_slot (), source));
-  source->book_updated.connect (sigc::bind<0> (book_updated.make_slot (), source));
-  source->contact_added.connect (sigc::bind<0> (contact_added.make_slot (), source));
-  source->contact_removed.connect (sigc::bind<0> (contact_removed.make_slot (), source));
-  source->contact_updated.connect (sigc::bind<0> (contact_updated.make_slot (), source));
+  conns.push_back (source->book_added.connect (sigc::bind<0> (book_added.make_slot (), source)));
+  conns.push_back (source->book_removed.connect (sigc::bind<0> (book_removed.make_slot (), source)));
+  conns.push_back (source->book_updated.connect (sigc::bind<0> (book_updated.make_slot (), source)));
+  conns.push_back (source->contact_added.connect (sigc::bind<0> (contact_added.make_slot (), source)));
+  conns.push_back (source->contact_removed.connect (sigc::bind<0> (contact_removed.make_slot (), source)));
+  conns.push_back (source->contact_updated.connect (sigc::bind<0> (contact_updated.make_slot (), source)));
   source->questions.add_handler (questions.make_slot ());
 }
 
diff --git a/lib/engine/addressbook/contact-core.h b/lib/engine/addressbook/contact-core.h
index 40d12ea..2241755 100644
--- a/lib/engine/addressbook/contact-core.h
+++ b/lib/engine/addressbook/contact-core.h
@@ -65,8 +65,8 @@ namespace Ekiga
    * Notice that you give sources to this object as references, so they won't
    * be freed here : it's up to you to free them somehow.
    */
-  class ContactCore: public Service,
-		     public sigc::trackable
+  class ContactCore:
+    public Service
   {
   public:
 
@@ -189,6 +189,8 @@ namespace Ekiga
     /** This chain allows the ContactCore to present forms to the user
      */
     ChainOfResponsibility<FormRequest*> questions;
+
+    std::list<sigc::connection> conns;
   };
 
 /**
diff --git a/lib/engine/presence/presence-core.cpp b/lib/engine/presence/presence-core.cpp
index 33f4671..2c2e301 100644
--- a/lib/engine/presence/presence-core.cpp
+++ b/lib/engine/presence/presence-core.cpp
@@ -46,13 +46,15 @@ Ekiga::PresenceCore::PresenceCore (Ekiga::ServiceCore& core)
   gmref_ptr<Ekiga::PersonalDetails> details = core.get ("personal-details");
 
   if (details)
-    details->updated.connect (sigc::bind (sigc::mem_fun (this, &Ekiga::PresenceCore::publish), details));
+    conns.push_back (details->updated.connect (sigc::bind (sigc::mem_fun (this, &Ekiga::PresenceCore::publish), details)));
   if (account_core)
-    account_core->registration_event.connect (sigc::bind (sigc::mem_fun (this, &Ekiga::PresenceCore::on_registration_event), details));
+    conns.push_back (account_core->registration_event.connect (sigc::bind (sigc::mem_fun (this, &Ekiga::PresenceCore::on_registration_event), details)));
 }
 
 Ekiga::PresenceCore::~PresenceCore ()
 {
+  for (std::list<sigc::connection>::iterator iter = conns.begin (); iter != conns.end (); ++iter)
+    iter->disconnect ();
 }
 
 void
@@ -60,12 +62,12 @@ Ekiga::PresenceCore::add_cluster (ClusterPtr cluster)
 {
   clusters.insert (cluster);
   cluster_added.emit (cluster);
-  cluster->heap_added.connect (sigc::bind (sigc::mem_fun (this, &Ekiga::PresenceCore::on_heap_added), cluster));
-  cluster->heap_updated.connect (sigc::bind (sigc::mem_fun (this, &Ekiga::PresenceCore::on_heap_updated), cluster));
-  cluster->heap_removed.connect (sigc::bind (sigc::mem_fun (this, &Ekiga::PresenceCore::on_heap_removed), cluster));
-  cluster->presentity_added.connect (sigc::bind (sigc::mem_fun (this, &Ekiga::PresenceCore::on_presentity_added), cluster));
-  cluster->presentity_updated.connect (sigc::bind (sigc::mem_fun (this, &Ekiga::PresenceCore::on_presentity_updated), cluster));
-  cluster->presentity_removed.connect (sigc::bind (sigc::mem_fun (this, &Ekiga::PresenceCore::on_presentity_removed), cluster));
+  conns.push_back (cluster->heap_added.connect (sigc::bind (sigc::mem_fun (this, &Ekiga::PresenceCore::on_heap_added), cluster)));
+  conns.push_back (cluster->heap_updated.connect (sigc::bind (sigc::mem_fun (this, &Ekiga::PresenceCore::on_heap_updated), cluster)));
+  conns.push_back (cluster->heap_removed.connect (sigc::bind (sigc::mem_fun (this, &Ekiga::PresenceCore::on_heap_removed), cluster)));
+  conns.push_back (cluster->presentity_added.connect (sigc::bind (sigc::mem_fun (this, &Ekiga::PresenceCore::on_presentity_added), cluster)));
+  conns.push_back (cluster->presentity_updated.connect (sigc::bind (sigc::mem_fun (this, &Ekiga::PresenceCore::on_presentity_updated), cluster)));
+  conns.push_back (cluster->presentity_removed.connect (sigc::bind (sigc::mem_fun (this, &Ekiga::PresenceCore::on_presentity_removed), cluster)));
   cluster->questions.add_handler (questions.make_slot ());
 }
 
@@ -164,8 +166,8 @@ void
 Ekiga::PresenceCore::add_presence_fetcher (gmref_ptr<PresenceFetcher> fetcher)
 {
   presence_fetchers.push_back (fetcher);
-  fetcher->presence_received.connect (sigc::mem_fun (this, &Ekiga::PresenceCore::on_presence_received));
-  fetcher->status_received.connect (sigc::mem_fun (this, &Ekiga::PresenceCore::on_status_received));
+  conns.push_back (fetcher->presence_received.connect (sigc::mem_fun (this, &Ekiga::PresenceCore::on_presence_received)));
+  conns.push_back (fetcher->status_received.connect (sigc::mem_fun (this, &Ekiga::PresenceCore::on_status_received)));
   for (std::map<std::string, uri_info>::const_iterator iter
 	 = uri_infos.begin ();
        iter != uri_infos.end ();
diff --git a/lib/engine/presence/presence-core.h b/lib/engine/presence/presence-core.h
index f82ab06..f481ad6 100644
--- a/lib/engine/presence/presence-core.h
+++ b/lib/engine/presence/presence-core.h
@@ -135,8 +135,7 @@ namespace Ekiga
    *         special registering magic?
    */
   class PresenceCore:
-    public Service,
-    public sigc::trackable
+    public Service
   {
   public:
 
@@ -323,6 +322,8 @@ namespace Ekiga
     /** This chain allows the PresenceCore to present forms to the user
      */
     ChainOfResponsibility<FormRequest*> questions;
+
+    std::list<sigc::connection> conns;
   };
 
 /**



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]