diff options
| -rw-r--r-- | indra/llcommon/llevents.cpp | 27 | ||||
| -rw-r--r-- | indra/llcommon/llevents.h | 7 | 
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();  | 
