summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNat Goodspeed <nat@lindenlab.com>2019-10-22 16:27:59 -0400
committerNat Goodspeed <nat@lindenlab.com>2020-03-25 19:00:10 -0400
commitaea1e469820d276d0bc077fb8b3a77a5e6a35faf (patch)
treeed09c40c1f2bb4e46d7577d3d35ff9330f19a2fa
parent5ec81cf0f79a9627478f5f06e036299d101a2256 (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.cpp3
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();
}
/*****************************************************************************