[ekiga] Removed strange memory problems in the presence and contact cores (sigc::trackable was supposed to h
- From: Julien Puydt <jpuydt src gnome org>
- To: svn-commits-list gnome org
- Subject: [ekiga] Removed strange memory problems in the presence and contact cores (sigc::trackable was supposed to h
- Date: Thu, 14 May 2009 08:20:20 -0400 (EDT)
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]