summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Kleshchev <andreykproductengine@lindenlab.com>2022-11-28 17:09:50 +0200
committerAndrey Kleshchev <andreykproductengine@lindenlab.com>2022-11-28 17:25:43 +0200
commit6de598633355d8867f4de483ab7e2f37a78679c4 (patch)
tree714c5e901ef381843b81791c572470892100f0ae
parente0f7b4d04b4bc0aa91150ff62edb4e0360ceaa74 (diff)
SL-18718 Crash at LLEventPump::listen and connection issues
Cleaner reinit and termination.
-rw-r--r--indra/newview/llenvironment.cpp25
-rw-r--r--indra/newview/llenvironment.h5
2 files changed, 23 insertions, 7 deletions
diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp
index 1300cf3658..4ef14c20f7 100644
--- a/indra/newview/llenvironment.cpp
+++ b/indra/newview/llenvironment.cpp
@@ -874,26 +874,37 @@ void LLEnvironment::initSingleton()
requestRegion();
- gAgent.addParcelChangedCallback([this]() { onParcelChange(); });
+ if (!mParcelCallbackConnection.connected())
+ {
+ mParcelCallbackConnection = gAgent.addParcelChangedCallback([this]() { onParcelChange(); });
- //TODO: This frequently results in one more request than we need. It isn't breaking, but should be nicer.
- // We need to know new env version to fix this, without it we can only do full re-request
- // Happens: on updates, on opening LLFloaterRegionInfo, on region crossing if info floater is open
- LLRegionInfoModel::instance().setUpdateCallback([this]() { requestRegion(); });
- gAgent.addRegionChangedCallback([this]() { onRegionChange(); });
+ //TODO: This frequently results in one more request than we need. It isn't breaking, but should be nicer.
+ // We need to know new env version to fix this, without it we can only do full re-request
+ // Happens: on updates, on opening LLFloaterRegionInfo, on region crossing if info floater is open
+ mRegionUpdateCallbackConnection = LLRegionInfoModel::instance().setUpdateCallback([this]() { requestRegion(); });
+ mRegionChangeCallbackConnection = gAgent.addRegionChangedCallback([this]() { onRegionChange(); });
- gAgent.whenPositionChanged([this](const LLVector3 &localpos, const LLVector3d &) { onAgentPositionHasChanged(localpos); });
+ mPositionCallbackConnection = gAgent.whenPositionChanged([this](const LLVector3 &localpos, const LLVector3d &) { onAgentPositionHasChanged(localpos); });
+ }
if (!gGenericDispatcher.isHandlerPresent(MESSAGE_PUSHENVIRONMENT))
{
gGenericDispatcher.addHandler(MESSAGE_PUSHENVIRONMENT, &environment_push_dispatch_handler);
}
+ LLEventPumps::instance().obtain(PUMP_EXPERIENCE).stopListening(LISTENER_NAME);
LLEventPumps::instance().obtain(PUMP_EXPERIENCE).listen(LISTENER_NAME, [this](LLSD message) { listenExperiencePump(message); return false; });
}
void LLEnvironment::cleanupSingleton()
{
+ if (mParcelCallbackConnection.connected())
+ {
+ mParcelCallbackConnection.disconnect();
+ mRegionUpdateCallbackConnection.disconnect();
+ mRegionChangeCallbackConnection.disconnect();
+ mPositionCallbackConnection.disconnect();
+ }
LLEventPumps::instance().obtain(PUMP_EXPERIENCE).stopListening(LISTENER_NAME);
}
diff --git a/indra/newview/llenvironment.h b/indra/newview/llenvironment.h
index 330de2bea8..64fd170e43 100644
--- a/indra/newview/llenvironment.h
+++ b/indra/newview/llenvironment.h
@@ -402,6 +402,11 @@ private:
bool mShowMoonBeacon;
S32 mEditorCounter;
+ connection_t mParcelCallbackConnection;
+ connection_t mRegionUpdateCallbackConnection;
+ connection_t mRegionChangeCallbackConnection;
+ connection_t mPositionCallbackConnection;
+
struct UpdateInfo
{
typedef std::shared_ptr<UpdateInfo> ptr_t;