summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorDave Houlton <euclid@lindenlab.com>2020-08-13 20:20:20 +0000
committerDave Houlton <euclid@lindenlab.com>2020-08-13 20:20:20 +0000
commit8189c900d840705255ee8c4ae9acbcd9d31c16e0 (patch)
tree0534a7f0cbe461b5dac33444f16a535dc9d13446 /indra
parentb55be119002d547887e739d50be3136e5040fa25 (diff)
parent0c0ed56167f76820f612d0069b1f2d6462cfcf98 (diff)
Merged in DV497-merge-6.4.7 (pull request #237)
Merge master v6.4.7 to LMR#4 DRTVWR-497
Diffstat (limited to 'indra')
-rw-r--r--indra/llmessage/llcoproceduremanager.cpp26
-rw-r--r--indra/newview/VIEWER_VERSION.txt2
-rw-r--r--indra/newview/llappviewer.cpp11
-rw-r--r--indra/newview/llstartup.cpp20
-rw-r--r--indra/newview/llviewerassetstorage.cpp13
-rw-r--r--indra/newview/llviewerassetstorage.h2
6 files changed, 47 insertions, 27 deletions
diff --git a/indra/llmessage/llcoproceduremanager.cpp b/indra/llmessage/llcoproceduremanager.cpp
index a7bd836c4d..42c19e3b1c 100644
--- a/indra/llmessage/llcoproceduremanager.cpp
+++ b/indra/llmessage/llcoproceduremanager.cpp
@@ -280,11 +280,14 @@ LLCoprocedurePool::LLCoprocedurePool(const std::string &poolName, size_t size):
mHTTPPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID),
mCoroMapping()
{
- // store in our LLTempBoundListener so that when the LLCoprocedurePool is
- // destroyed, we implicitly disconnect from this LLEventPump
- mStatusListener = LLEventPumps::instance().obtain("LLApp").listen(
- poolName,
- [pendingCoprocs=mPendingCoprocs, poolName](const LLSD& status)
+ try
+ {
+ // store in our LLTempBoundListener so that when the LLCoprocedurePool is
+ // destroyed, we implicitly disconnect from this LLEventPump
+ // Monitores application status
+ mStatusListener = LLEventPumps::instance().obtain("LLApp").listen(
+ poolName + "_pool", // Make sure it won't repeat names from lleventcoro
+ [pendingCoprocs = mPendingCoprocs, poolName](const LLSD& status)
{
auto& statsd = status["status"];
if (statsd.asString() != "running")
@@ -298,6 +301,19 @@ LLCoprocedurePool::LLCoprocedurePool(const std::string &poolName, size_t size):
}
return false;
});
+ }
+ catch (const LLEventPump::DupListenerName &)
+ {
+ // This shounldn't be possible since LLCoprocedurePool is supposed to have unique names,
+ // yet it somehow did happen, as result pools got '_pool' suffix and this catch.
+ //
+ // If this somehow happens again it is better to crash later on shutdown due to pump
+ // not stopping coroutine and see warning in logs than on startup or during login.
+ LL_WARNS("CoProcMgr") << "Attempted to register dupplicate listener name: " << poolName
+ << "_pool. Failed to start listener." << LL_ENDL;
+
+ llassert(0); // Fix Me! Ignoring missing listener!
+ }
for (size_t count = 0; count < mPoolSize; ++count)
{
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index 3d05e8cfb4..3c43d71599 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-6.4.6
+6.4.7
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index b933060155..32df6ea32a 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -3099,8 +3099,15 @@ LLSD LLAppViewer::getViewerInfo() const
// return a URL to the release notes for this viewer, such as:
// https://releasenotes.secondlife.com/viewer/2.1.0.123456.html
- std::string url = versionInfo.getReleaseNotes();
- info["VIEWER_RELEASE_NOTES_URL"] = url.empty()? LLTrans::getString("RetrievingData") : url;
+ std::string url = versionInfo.getReleaseNotes(); // VVM supplied
+ if (url.empty())
+ {
+ url = LLTrans::getString("RELEASE_NOTES_BASE_URL");
+ if (!LLStringUtil::endsWith(url, "/"))
+ url += "/";
+ url += LLURI::escape(versionInfo.getVersion()) + ".html";
+ }
+ info["VIEWER_RELEASE_NOTES_URL"] = url;
// Position
LLViewerRegion* region = gAgent.getRegion();
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 4b65ead236..38ed022c44 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -2301,29 +2301,13 @@ void login_callback(S32 option, void *userdata)
void show_release_notes_if_required()
{
static bool release_notes_shown = false;
- // We happen to know that instantiating LLVersionInfo implicitly
- // instantiates the LLEventMailDrop named "relnotes", which we (might) use
- // below. If viewer release notes stop working, might be because that
- // LLEventMailDrop got moved out of LLVersionInfo and hasn't yet been
- // instantiated.
if (!release_notes_shown && (LLVersionInfo::instance().getChannelAndVersion() != gLastRunVersion)
&& LLVersionInfo::instance().getViewerMaturity() != LLVersionInfo::TEST_VIEWER // don't show Release Notes for the test builds
&& gSavedSettings.getBOOL("UpdaterShowReleaseNotes")
&& !gSavedSettings.getBOOL("FirstLoginThisInstall"))
{
- // Instantiate a "relnotes" listener which assumes any arriving event
- // is the release notes URL string. Since "relnotes" is an
- // LLEventMailDrop, this listener will be invoked whether or not the
- // URL has already been posted. If so, it will fire immediately;
- // otherwise it will fire whenever the URL is (later) posted. Either
- // way, it will display the release notes as soon as the URL becomes
- // available.
- LLEventPumps::instance().obtain("relnotes").listen(
- "showrelnotes",
- [](const LLSD& url){
- LLWeb::loadURLInternal(url.asString());
- return false;
- });
+ LLSD info(LLAppViewer::instance()->getViewerInfo());
+ LLWeb::loadURLInternal(info["VIEWER_RELEASE_NOTES_URL"]);
release_notes_shown = true;
}
}
diff --git a/indra/newview/llviewerassetstorage.cpp b/indra/newview/llviewerassetstorage.cpp
index e0b64403ef..b295fa2977 100644
--- a/indra/newview/llviewerassetstorage.cpp
+++ b/indra/newview/llviewerassetstorage.cpp
@@ -49,6 +49,8 @@
/// LLViewerAssetRequest
///----------------------------------------------------------------------------
+static const std::string VIEWER_ASSET_STORAGE_CORO_POOL = "VAssetStorage";
+
/**
* @brief Local class to encapsulate asset fetch requests with a timestamp.
*
@@ -127,6 +129,15 @@ LLViewerAssetStorage::LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *
{
}
+LLViewerAssetStorage::~LLViewerAssetStorage()
+{
+ if (!LLCoprocedureManager::wasDeleted())
+ {
+ // This class has dedicated coroutine pool, clean it up, otherwise coroutines will crash later.
+ LLCoprocedureManager::instance().close(VIEWER_ASSET_STORAGE_CORO_POOL);
+ }
+}
+
// virtual
void LLViewerAssetStorage::storeAssetData(
const LLTransactionID& tid,
@@ -399,7 +410,7 @@ void LLViewerAssetStorage::queueRequestHttp(
bool is_temp = false;
LLViewerAssetStatsFF::record_enqueue(atype, with_http, is_temp);
- LLCoprocedureManager::instance().enqueueCoprocedure("AssetStorage","LLViewerAssetStorage::assetRequestCoro",
+ LLCoprocedureManager::instance().enqueueCoprocedure(VIEWER_ASSET_STORAGE_CORO_POOL,"LLViewerAssetStorage::assetRequestCoro",
boost::bind(&LLViewerAssetStorage::assetRequestCoro, this, req, uuid, atype, callback, user_data));
}
}
diff --git a/indra/newview/llviewerassetstorage.h b/indra/newview/llviewerassetstorage.h
index cefe215431..ef01d179b7 100644
--- a/indra/newview/llviewerassetstorage.h
+++ b/indra/newview/llviewerassetstorage.h
@@ -43,6 +43,8 @@ public:
LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
LLVFS *vfs, LLVFS *static_vfs);
+ ~LLViewerAssetStorage();
+
virtual void storeAssetData(
const LLTransactionID& tid,
LLAssetType::EType atype,