From 60651640a3114dd2c6a8c0f880234921506ab207 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <117672381+akleshchev@users.noreply.github.com>
Date: Fri, 13 Feb 2026 02:10:45 +0200
Subject: #5084 Adjust Window's watchdog to only run after login
like mainloop does
---
indra/newview/llappviewer.cpp | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
(limited to 'indra/newview')
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 35edbf089e..93a0cd9d43 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -3200,7 +3200,6 @@ bool LLAppViewer::initWindow()
app->createErrorMarker(LAST_EXEC_FROZE);
}
});
- gViewerWindow->getWindow()->initWatchdog();
}
LLNotificationsUI::LLNotificationManager::getInstance();
@@ -5924,6 +5923,11 @@ void LLAppViewer::handleLoginComplete()
{
gLoggedInTime.start();
initMainloopTimeout("Mainloop Init");
+ LLWindow* viewer_window = gViewerWindow->getWindow();
+ if (viewer_window) // in case of a headless client
+ {
+ viewer_window->initWatchdog();
+ }
// Store some data to DebugInfo in case of a freeze.
gDebugInfo["ClientInfo"]["Name"] = LLVersionInfo::instance().getChannel();
--
cgit v1.3
From 44e21aa718211cf34a59a036f2831c2e80fef8e1 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <117672381+akleshchev@users.noreply.github.com>
Date: Mon, 23 Feb 2026 20:23:37 +0200
Subject: #5084 Adjust watchdog for bettet tracking of logout
---
indra/newview/llappviewer.cpp | 13 +++++++++++++
1 file changed, 13 insertions(+)
(limited to 'indra/newview')
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 93a0cd9d43..9a421972e5 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -1641,17 +1641,20 @@ bool LLAppViewer::doFrame()
if (LLApp::isExiting())
{
+ pingMainloopTimeout("Main:qSnapshot");
// Save snapshot for next time, if we made it through initialization
if (STATE_STARTED == LLStartUp::getStartupState())
{
saveFinalSnapshot();
}
+ pingMainloopTimeout("Main:TerminateVoice");
if (LLVoiceClient::instanceExists())
{
LLVoiceClient::getInstance()->terminate();
}
+ pingMainloopTimeout("Main:TerminatePump");
delete gServicePump;
gServicePump = NULL;
@@ -4179,6 +4182,7 @@ void LLAppViewer::requestQuit()
return;
}
+ pingMainloopTimeout("Main:qMetrics");
// Try to send metrics back to the grid
metricsSend(!gDisconnected);
@@ -4194,6 +4198,7 @@ void LLAppViewer::requestQuit()
LLHUDManager::getInstance()->sendEffects();
effectp->markDead() ;//remove it.
+ pingMainloopTimeout("Main:qFloaters");
// Attempt to close all floaters that might be
// editing things.
if (gFloaterView)
@@ -4202,6 +4207,7 @@ void LLAppViewer::requestQuit()
gFloaterView->closeAllChildren(true);
mClosingFloaters = true;
}
+ pingMainloopTimeout("Main:qStats");
// Send preferences once, when exiting
bool include_preferences = true;
@@ -4209,6 +4215,7 @@ void LLAppViewer::requestQuit()
gLogoutTimer.reset();
mQuitRequested = true;
+ pingMainloopTimeout("Main:LoggingOut");
}
static bool finish_quit(const LLSD& notification, const LLSD& response)
@@ -5489,6 +5496,7 @@ void LLAppViewer::outOfMemorySoftQuit()
LLLFSThread::sLocal->pause();
gLogoutTimer.reset();
mQuitRequested = true;
+ destroyMainloopTimeout();
LLError::LLUserWarningMsg::showOutOfMemory();
}
@@ -5905,6 +5913,11 @@ void LLAppViewer::pingMainloopTimeout(std::string_view state)
F32 LLAppViewer::getMainloopTimeoutSec() const
{
+ if (isQuitting() || mQuitRequested)
+ {
+ constexpr F32 QUITTING_SECONDS = 240.f;
+ return QUITTING_SECONDS;
+ }
if (LLStartUp::getStartupState() == STATE_STARTED
&& gAgent.getTeleportState() == LLAgent::TELEPORT_NONE)
{
--
cgit v1.3
From ca3a23b42641dceaaaea36faef6231c03a563aa3 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <117672381+akleshchev@users.noreply.github.com>
Date: Mon, 2 Mar 2026 20:31:21 +0200
Subject: #3612 Fix viewer not getting 'nonexistent region' responses
which are needed to process 'copy slurl'
---
indra/newview/lllandmarkactions.cpp | 5 ++++
indra/newview/llworldmapmessage.cpp | 56 ++++++++++++++++++++++---------------
2 files changed, 39 insertions(+), 22 deletions(-)
(limited to 'indra/newview')
diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp
index b9d1c7ba18..9b90e41549 100644
--- a/indra/newview/lllandmarkactions.cpp
+++ b/indra/newview/lllandmarkactions.cpp
@@ -473,6 +473,11 @@ void LLLandmarkActions::copySLURLtoClipboard(const LLUUID& landmarkInventoryItem
void copy_slurl_to_clipboard_callback(const std::string& slurl)
{
+ if (slurl.empty())
+ {
+ LLNotificationsUtil::add("LandmarkLocationUnknown");
+ return;
+ }
gViewerWindow->getWindow()->copyTextToClipboard(utf8str_to_wstring(slurl));
LLSD args;
args["SLURL"] = slurl;
diff --git a/indra/newview/llworldmapmessage.cpp b/indra/newview/llworldmapmessage.cpp
index e81e6b4596..a5433133ab 100644
--- a/indra/newview/llworldmapmessage.cpp
+++ b/indra/newview/llworldmapmessage.cpp
@@ -33,7 +33,8 @@
#include "llagent.h"
#include "llfloaterworldmap.h"
-const U32 LAYER_FLAG = 2;
+constexpr U32 LAYER_FLAG = 2;
+constexpr S32 MAP_SIM_RETURN_NULL_SIMS = 0x00010000;
//---------------------------------------------------------------------------
// World Map Message Handling
@@ -135,7 +136,11 @@ void LLWorldMapMessage::sendMapBlockRequest(U16 min_x, U16 min_y, U16 max_x, U16
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
U32 flags = LAYER_FLAG;
- flags |= (return_nonexistent ? 0x10000 : 0);
+ if (return_nonexistent)
+ {
+ // overwrite LAYER_FLAG, otherwise server won't respond to missing regions
+ flags = MAP_SIM_RETURN_NULL_SIMS;
+ }
msg->addU32Fast(_PREHASH_Flags, flags);
msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim
msg->addBOOLFast(_PREHASH_Godlike, false); // Filled in on sim
@@ -157,15 +162,17 @@ void LLWorldMapMessage::processMapBlockReply(LLMessageSystem* msg, void**)
U32 agent_flags;
msg->getU32Fast(_PREHASH_AgentData, _PREHASH_Flags, agent_flags);
- // There's only one flag that we ever use here
- if (agent_flags != LAYER_FLAG)
+ S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_Data);
+
+ // There's only one flag that we ever use here, unless we also want an existence check.
+ if (agent_flags != LAYER_FLAG
+ && num_blocks != 1) // we check existence for a single region
{
LL_WARNS() << "Invalid map image type returned! layer = " << agent_flags << LL_ENDL;
return;
}
- S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_Data);
- //LL_INFOS("WorldMap") << "num_blocks = " << num_blocks << LL_ENDL;
+ LL_DEBUGS("WorldMap") << "num_blocks = " << num_blocks << LL_ENDL;
bool found_null_sim = false;
@@ -191,26 +198,31 @@ void LLWorldMapMessage::processMapBlockReply(LLMessageSystem* msg, void**)
U32 x_world = (U32)(x_regions) * REGION_WIDTH_UNITS;
U32 y_world = (U32)(y_regions) * REGION_WIDTH_UNITS;
- // name shouldn't be empty, see EXT-4568
- llassert(!name.empty());
-
- // Insert that region in the world map, if failure, flag it as a "null_sim"
- if (!(LLWorldMap::getInstance()->insertRegion(x_world, y_world, name, image_id, (U32)accesscode, region_flags)))
+ // Name shouldn't be empty unless region doesn't exist
+ if (!name.empty())
{
- found_null_sim = true;
- }
+ // Insert that region in the world map, if failure, flag it as a "null_sim"
+ if (!(LLWorldMap::getInstance()->insertRegion(x_world, y_world, name, image_id, (U32)accesscode, region_flags)))
+ {
+ found_null_sim = true;
+ }
- // If we hit a valid tracking location, do what needs to be done app level wise
- if (LLWorldMap::getInstance()->isTrackingValidLocation())
- {
- LLVector3d pos_global = LLWorldMap::getInstance()->getTrackedPositionGlobal();
- if (LLWorldMap::getInstance()->isTrackingDoubleClick())
+ // If we hit a valid tracking location, do what needs to be done app level wise
+ if (LLWorldMap::getInstance()->isTrackingValidLocation())
{
- // Teleport if the user double clicked
- gAgent.teleportViaLocation(pos_global);
+ LLVector3d pos_global = LLWorldMap::getInstance()->getTrackedPositionGlobal();
+ if (LLWorldMap::getInstance()->isTrackingDoubleClick())
+ {
+ // Teleport if the user double clicked
+ gAgent.teleportViaLocation(pos_global);
+ }
+ // Update the "real" tracker information
+ gFloaterWorldMap->trackLocation(pos_global);
}
- // Update the "real" tracker information
- gFloaterWorldMap->trackLocation(pos_global);
+ }
+ else
+ {
+ found_null_sim = true;
}
// Handle the SLURL callback if any
--
cgit v1.3
From e572093ef7e0ed4c9d94be4ecaae850bcdb73e54 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <117672381+akleshchev@users.noreply.github.com>
Date: Tue, 3 Mar 2026 19:10:00 +0200
Subject: #5084 Disable watchdog in 26.1
There is a deadlock that looks to be caused by singleton+watchdog interactions, will resolve in 26.2
---
indra/newview/app_settings/settings.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'indra/newview')
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 9058220820..372a84743f 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -13879,7 +13879,7 @@
Type
S32
Value
- 1
+ 0
WaterGLFogDensityScale