diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2018-10-01 13:48:58 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2018-10-02 08:48:15 +0200 |
commit | 9ccb282f8973c2554339f3917fe35fcc8b4c2396 (patch) | |
tree | 90e311cc2e7980babe82d4ffac630ab5a1e74d65 /svl | |
parent | dc1c424acfb4b3504a19be52417d23f1c5c30ee8 (diff) |
fix bug in SvtBroadcaster copy constructor
otherwise we end up with duplicated listeners on our list, because we
add them twice
Change-Id: Ia5cdd3584d49ef11b89cf12fc9ebf07441a47724
Reviewed-on: https://gerrit.libreoffice.org/61202
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'svl')
-rw-r--r-- | svl/source/notify/broadcast.cxx | 32 |
1 files changed, 10 insertions, 22 deletions
diff --git a/svl/source/notify/broadcast.cxx b/svl/source/notify/broadcast.cxx index 145aa81b22b5..61fd98dff3ec 100644 --- a/svl/source/notify/broadcast.cxx +++ b/svl/source/notify/broadcast.cxx @@ -63,8 +63,11 @@ void SvtBroadcaster::Remove( SvtListener* p ) Normalize(); auto it = std::lower_bound(maListeners.begin(), maListeners.end(), p); + assert (it != maListeners.end() && *it == p); if (it != maListeners.end() && *it == p) + { maListeners.erase(it); + } if (maListeners.empty()) ListenersGone(); @@ -73,31 +76,16 @@ void SvtBroadcaster::Remove( SvtListener* p ) SvtBroadcaster::SvtBroadcaster() : mbAboutToDie(false), mbDisposing(false), mbNormalized(false), mbDestNormalized(false) {} SvtBroadcaster::SvtBroadcaster( const SvtBroadcaster &rBC ) : - maListeners(rBC.maListeners), maDestructedListeners(rBC.maDestructedListeners), - mbAboutToDie(rBC.mbAboutToDie), mbDisposing(false), - mbNormalized(rBC.mbNormalized), mbDestNormalized(rBC.mbDestNormalized) + mbAboutToDie(false), mbDisposing(false), + mbNormalized(true), mbDestNormalized(true) { - assert(!mbAboutToDie && "copying an object marked with PrepareForDestruction()?"); + assert(!rBC.mbAboutToDie && "copying an object marked with PrepareForDestruction()?"); + assert(!rBC.mbDisposing && "copying an object that is in it's destructor?"); - if (mbAboutToDie) - Normalize(); - - ListenersType::const_iterator dest(maDestructedListeners.begin()); - for (ListenersType::iterator it(maListeners.begin()); it != maListeners.end(); ++it) + maListeners.reserve(rBC.maListeners.size()); + for (ListenersType::iterator it(rBC.maListeners.begin()); it != rBC.maListeners.end(); ++it) { - bool bStart = true; - - if (mbAboutToDie) - { - // skip the destructed ones - while (dest != maDestructedListeners.end() && (*dest < *it)) - ++dest; - - bStart = (dest == maDestructedListeners.end() || *dest != *it); - } - - if (bStart) - (*it)->StartListening(*this); + (*it)->StartListening(*this); // this will call back into this->Add() } } |