svl/source/notify/broadcast.cxx | 32 ++++++++++---------------------- 1 file changed, 10 insertions(+), 22 deletions(-)
New commits: commit 9ccb282f8973c2554339f3917fe35fcc8b4c2396 Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Mon Oct 1 13:48:58 2018 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Tue Oct 2 08:48:15 2018 +0200 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.gran...@collabora.co.uk> 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() } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits