SL-18718 Crash at LLEventPump::listen and connection issues

Cleaner reinit and termination.
meow-7.2.2
Andrey Kleshchev 2022-11-28 17:09:50 +02:00
parent e0f7b4d04b
commit 6de5986333
2 changed files with 23 additions and 7 deletions

View File

@ -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);
}

View File

@ -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;