summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNat Goodspeed <nat@lindenlab.com>2018-12-29 10:15:28 -0500
committerNat Goodspeed <nat@lindenlab.com>2020-03-25 18:39:19 -0400
commit0c32c98f25f3f7d99a244a249dc08b03cd36a5b0 (patch)
treee4a1d61ebddaf24a21c246791acbd91bd20e136d
parent66981fab0b3c8dcc3a031d50710a2b24ec6b0603 (diff)
SL-793: Add LLEventPumps::clear() method to disconnect all listeners.
This is like the existing reset() method, except that reset() is specifically intended for shutdown: it disables every existing LLEventPump in such a way that it cannot be subsequently reused. (The original idea was to disconnect listeners in DLLs unloaded at shutdown.) clear() forcibly disconnects all existing listeners, but leaves LLEventPumps ready for reuse. This is useful (e.g.) for test programs to reset the state of LLEventPumps between individual test functions.
-rw-r--r--indra/llcommon/llevents.cpp27
-rw-r--r--indra/llcommon/llevents.h7
2 files changed, 29 insertions, 5 deletions
diff --git a/indra/llcommon/llevents.cpp b/indra/llcommon/llevents.cpp
index eedd8c92b5..99abb333bb 100644
--- a/indra/llcommon/llevents.cpp
+++ b/indra/llcommon/llevents.cpp
@@ -45,6 +45,7 @@
#include <cctype>
// external library headers
#include <boost/range/iterator_range.hpp>
+#include <boost/make_shared.hpp>
#if LL_WINDOWS
#pragma warning (push)
#pragma warning (disable : 4701) // compiler thinks might use uninitialized var, but no
@@ -154,13 +155,23 @@ void LLEventPumps::flush()
}
}
+void LLEventPumps::clear()
+{
+ // Clear every known LLEventPump instance. Leave it up to each instance to
+ // decide what to do with the clear() call.
+ for (PumpMap::value_type& pair : mPumpMap)
+ {
+ pair.second->clear();
+ }
+}
+
void LLEventPumps::reset()
{
// Reset every known LLEventPump instance. Leave it up to each instance to
// decide what to do with the reset() call.
- for (PumpMap::iterator pmi = mPumpMap.begin(), pmend = mPumpMap.end(); pmi != pmend; ++pmi)
+ for (PumpMap::value_type& pair : mPumpMap)
{
- pmi->second->reset();
+ pair.second->reset();
}
}
@@ -283,7 +294,7 @@ LLEventPump::LLEventPump(const std::string& name, bool tweak):
// Register every new instance with LLEventPumps
mRegistry(LLEventPumps::instance().getHandle()),
mName(mRegistry.get()->registerNew(*this, name, tweak)),
- mSignal(new LLStandardSignal()),
+ mSignal(boost::make_shared<LLStandardSignal>()),
mEnabled(true)
{}
@@ -311,6 +322,14 @@ std::string LLEventPump::inventName(const std::string& pfx)
return STRINGIZE(pfx << suffix++);
}
+void LLEventPump::clear()
+{
+ // Destroy the original LLStandardSignal instance, replacing it with a
+ // whole new one.
+ mSignal = boost::make_shared<LLStandardSignal>();
+ mConnections.clear();
+}
+
void LLEventPump::reset()
{
mSignal.reset();
@@ -553,7 +572,7 @@ bool LLEventMailDrop::post(const LLSD& event)
// be posted to any future listeners when they attach.
mEventHistory.push_back(event);
}
-
+
return posted;
}
diff --git a/indra/llcommon/llevents.h b/indra/llcommon/llevents.h
index 62d97007ac..18525a8fa5 100644
--- a/indra/llcommon/llevents.h
+++ b/indra/llcommon/llevents.h
@@ -264,6 +264,11 @@ public:
void flush();
/**
+ * Disconnect listeners from all known LLEventPump instances
+ */
+ void clear();
+
+ /**
* Reset all known LLEventPump instances
* workaround for DEV-35406 crash on shutdown
*/
@@ -587,7 +592,7 @@ public:
private:
friend class LLEventPumps;
-
+ virtual void clear();
virtual void reset();