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

Reply via email to