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;
class SVL_DLLPUBLIC SvtListener
{
friend class SvtBroadcaster;
typedef std::unordered_set<SvtBroadcaster*> BroadcastersType;
BroadcastersType maBroadcasters;
const SvtListener& operator=(const SvtListener &) = delete;
// called from the SvtBroadcaster destructor
void BroadcasterDying( SvtBroadcaster& rBroadcaster );
public:
class SVL_DLLPUBLIC QueryBase
......
......@@ -60,11 +60,11 @@ void SvtBroadcaster::Remove( SvtListener* p )
}
Normalize();
std::pair<ListenersType::iterator,ListenersType::iterator> r =
std::equal_range(maListeners.begin(), maListeners.end(), p);
if (r.first != r.second)
maListeners.erase(r.first, r.second);
auto it = std::lower_bound(maListeners.begin(), maListeners.end(), p);
if (it != maListeners.end() && *it == p)
maListeners.erase(it);
if (maListeners.empty())
ListenersGone();
}
......@@ -116,7 +116,7 @@ SvtBroadcaster::~SvtBroadcaster()
++dest;
if (dest == maDestructedListeners.end() || *dest != *it)
(*it)->EndListening(*this);
(*it)->BroadcasterDying(*this);
}
}
......
......@@ -19,6 +19,7 @@
#include <svl/listener.hxx>
#include <svl/broadcast.hxx>
#include <cassert>
SvtListener::QueryBase::QueryBase( sal_uInt16 nId ) : mnId(nId) {}
SvtListener::QueryBase::~QueryBase() {}
......@@ -65,6 +66,15 @@ bool SvtListener::EndListening( SvtBroadcaster& rBroadcaster )
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()
{
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