diff options
author | Nat Goodspeed <nat@lindenlab.com> | 2019-10-22 16:27:59 -0400 |
---|---|---|
committer | Nat Goodspeed <nat@lindenlab.com> | 2020-03-25 19:00:10 -0400 |
commit | aea1e469820d276d0bc077fb8b3a77a5e6a35faf (patch) | |
tree | ed09c40c1f2bb4e46d7577d3d35ff9330f19a2fa | |
parent | 5ec81cf0f79a9627478f5f06e036299d101a2256 (diff) |
DRTVWR-476: Make ~LLEventPumps() call reset() on its way out.
~LLEventPumps() deletes every LLEventPump instance it created itself. However,
many classes themselves contain LLEventPump subclass instances. These are
registered with LLEventPumps without it managing their lifespan.
But LLEventPump::reset() frees the LLStandardSignal aka
boost::signals2::signal instance owned by the LLEventPump, perforce
disconnecting all current listeners and disabling the LLEventPump. Even though
the instance still exists, if someone subsequently calls post(), nothing will
happen -- which is better than control trying to reach a method of a deleted
object.
-rw-r--r-- | indra/llcommon/llevents.cpp | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/indra/llcommon/llevents.cpp b/indra/llcommon/llevents.cpp index 281a1121bd..64fb985951 100644 --- a/indra/llcommon/llevents.cpp +++ b/indra/llcommon/llevents.cpp @@ -266,6 +266,9 @@ LLEventPumps::~LLEventPumps() { delete *mOurPumps.begin(); } + // Reset every remaining registered LLEventPump subclass instance: those + // we DIDN'T instantiate using either make() or obtain(). + reset(); } /***************************************************************************** |