summaryrefslogtreecommitdiff
path: root/svl
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2018-10-01 13:48:58 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2018-10-02 08:48:15 +0200
commit9ccb282f8973c2554339f3917fe35fcc8b4c2396 (patch)
tree90e311cc2e7980babe82d4ffac630ab5a1e74d65 /svl
parentdc1c424acfb4b3504a19be52417d23f1c5c30ee8 (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.cxx32
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()
}
}