Kaydet (Commit) 89e2ec08 authored tarafından Noel Grandin's avatar Noel Grandin Kaydeden (comit) Noel Grandin

don't call back into the SvtBroadcaster when dying

and we don't need to use equal_range on a sorted and uniqued vector,
lower_bound will do

Change-Id: I3f967c04b43432875e3d4de75e6e87bfdef40dc8
Reviewed-on: https://gerrit.libreoffice.org/61135
Tested-by: Jenkins
Reviewed-by: 's avatarNoel Grandin <noel.grandin@collabora.co.uk>
üst 89a60912
...@@ -28,10 +28,13 @@ class SfxHint; ...@@ -28,10 +28,13 @@ class SfxHint;
class SVL_DLLPUBLIC SvtListener class SVL_DLLPUBLIC SvtListener
{ {
friend class SvtBroadcaster;
typedef std::unordered_set<SvtBroadcaster*> BroadcastersType; typedef std::unordered_set<SvtBroadcaster*> BroadcastersType;
BroadcastersType maBroadcasters; BroadcastersType maBroadcasters;
const SvtListener& operator=(const SvtListener &) = delete; const SvtListener& operator=(const SvtListener &) = delete;
// called from the SvtBroadcaster destructor
void BroadcasterDying( SvtBroadcaster& rBroadcaster );
public: public:
class SVL_DLLPUBLIC QueryBase class SVL_DLLPUBLIC QueryBase
......
...@@ -60,11 +60,11 @@ void SvtBroadcaster::Remove( SvtListener* p ) ...@@ -60,11 +60,11 @@ void SvtBroadcaster::Remove( SvtListener* p )
} }
Normalize(); Normalize();
std::pair<ListenersType::iterator,ListenersType::iterator> r =
std::equal_range(maListeners.begin(), maListeners.end(), p);
if (r.first != r.second) auto it = std::lower_bound(maListeners.begin(), maListeners.end(), p);
maListeners.erase(r.first, r.second); if (it != maListeners.end() && *it == p)
maListeners.erase(it);
if (maListeners.empty()) if (maListeners.empty())
ListenersGone(); ListenersGone();
} }
...@@ -116,7 +116,7 @@ SvtBroadcaster::~SvtBroadcaster() ...@@ -116,7 +116,7 @@ SvtBroadcaster::~SvtBroadcaster()
++dest; ++dest;
if (dest == maDestructedListeners.end() || *dest != *it) if (dest == maDestructedListeners.end() || *dest != *it)
(*it)->EndListening(*this); (*it)->BroadcasterDying(*this);
} }
} }
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <svl/listener.hxx> #include <svl/listener.hxx>
#include <svl/broadcast.hxx> #include <svl/broadcast.hxx>
#include <cassert>
SvtListener::QueryBase::QueryBase( sal_uInt16 nId ) : mnId(nId) {} SvtListener::QueryBase::QueryBase( sal_uInt16 nId ) : mnId(nId) {}
SvtListener::QueryBase::~QueryBase() {} SvtListener::QueryBase::~QueryBase() {}
...@@ -65,6 +66,15 @@ bool SvtListener::EndListening( SvtBroadcaster& rBroadcaster ) ...@@ -65,6 +66,15 @@ bool SvtListener::EndListening( SvtBroadcaster& rBroadcaster )
return true; return true;
} }
// called from the SvtBroadcaster destructor, used to avoid calling
// back into the broadcaster again
void SvtListener::BroadcasterDying( SvtBroadcaster& rBroadcaster )
{
BroadcastersType::iterator it = maBroadcasters.find(&rBroadcaster);
if (it != maBroadcasters.end())
maBroadcasters.erase(it);
}
void SvtListener::EndListeningAll() void SvtListener::EndListeningAll()
{ {
BroadcastersType::iterator it = maBroadcasters.begin(); BroadcastersType::iterator it = maBroadcasters.begin();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment