diff --git a/indra/llcommon/llcoros.cpp b/indra/llcommon/llcoros.cpp
index febe74b559c6694dfb48d4705c1b54b6cd8bc3ab..5f940de52b5444b59cad89894890a335682a0268 100644
--- a/indra/llcommon/llcoros.cpp
+++ b/indra/llcommon/llcoros.cpp
@@ -192,7 +192,8 @@ bool LLCoros::kill(const std::string& name)
 }
 |*==========================================================================*/
 
-std::string LLCoros::getName() const
+//static
+std::string LLCoros::getName()
 {
     return get_CoroData("getName()").mName;
 }
@@ -320,12 +321,21 @@ void LLCoros::toplevel(std::string name, callable_t callable)
     }
 }
 
+//static
 void LLCoros::checkStop()
 {
     if (wasDeleted())
     {
         LLTHROW(Shutdown("LLCoros was deleted"));
     }
+    // do this AFTER the check above, because getName() depends on
+    // get_CoroData(), which depends on the local_ptr in our instance().
+    if (getName().empty())
+    {
+        // Our Stop exception and its subclasses are intended to stop loitering
+        // coroutines. Don't throw it from the main coroutine.
+        return;
+    }
     if (LLApp::isStopped())
     {
         LLTHROW(Stopped("viewer is stopped"));
diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h
index 7b3420cc8f5c1404a22742542cd42ad71b7cbb02..2e4cd8ccad0f0dc2e4cbbd88768bcfdfc79f6955 100644
--- a/indra/llcommon/llcoros.h
+++ b/indra/llcommon/llcoros.h
@@ -140,7 +140,7 @@ class LL_COMMON_API LLCoros: public LLSingleton<LLCoros>
      * (e.g. if the coroutine was launched by hand rather than using
      * LLCoros::launch()).
      */
-    std::string getName() const;
+    static std::string getName();
 
     /**
      * For delayed initialization. To be clear, this will only affect
@@ -295,7 +295,7 @@ inline
 std::string logname()
 {
     static std::string main("main");
-    std::string name(LLCoros::instance().getName());
+    std::string name(LLCoros::getName());
     return name.empty()? main : name;
 }
 
diff --git a/indra/llcommon/lleventcoro.cpp b/indra/llcommon/lleventcoro.cpp
index 967c4d74d8c9da30379697b4766bc29f2dfe3d02..11b6e5bb2f582f58a2bff683b31abaaf366bcb90 100644
--- a/indra/llcommon/lleventcoro.cpp
+++ b/indra/llcommon/lleventcoro.cpp
@@ -62,7 +62,7 @@ namespace
 std::string listenerNameForCoro()
 {
     // If this coroutine was launched by LLCoros::launch(), find that name.
-    std::string name(LLCoros::instance().getName());
+    std::string name(LLCoros::getName());
     if (! name.empty())
     {
         return name;
diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp
index 6a287f0cc5cf43b87145f482d3339a53f31aac60..fbd65cc67b36234d5aabe6a6efb567d04f6ea91b 100644
--- a/indra/llmessage/llavatarnamecache.cpp
+++ b/indra/llmessage/llavatarnamecache.cpp
@@ -134,7 +134,7 @@ LLAvatarNameCache::~LLAvatarNameCache()
 
 void LLAvatarNameCache::requestAvatarNameCache_(std::string url, std::vector<LLUUID> agentIds)
 {
-    LL_DEBUGS("AvNameCache") << "Entering coroutine " << LLCoros::instance().getName()
+    LL_DEBUGS("AvNameCache") << "Entering coroutine " << LLCoros::getName()
         << " with url '" << url << "', requesting " << agentIds.size() << " Agent Ids" << LL_ENDL;
 
     // Check pointer that can be cleaned up by cleanupClass()
@@ -188,7 +188,7 @@ void LLAvatarNameCache::requestAvatarNameCache_(std::string url, std::vector<LLU
     }
     catch (...)
     {
-        LOG_UNHANDLED_EXCEPTION(STRINGIZE("coroutine " << LLCoros::instance().getName()
+        LOG_UNHANDLED_EXCEPTION(STRINGIZE("coroutine " << LLCoros::getName()
                                           << "('" << url << "', " << agentIds.size()
                                           << " http result: " << httpResults.asString()
                                           << " Agent Ids)"));
diff --git a/indra/newview/llaccountingcostmanager.cpp b/indra/newview/llaccountingcostmanager.cpp
index 1dddf5296171cd8a73d9f64b01377f02df7f90df..e09527a34b5802fcbed9128d168dc1c844ea5e0e 100644
--- a/indra/newview/llaccountingcostmanager.cpp
+++ b/indra/newview/llaccountingcostmanager.cpp
@@ -48,7 +48,7 @@ LLAccountingCostManager::LLAccountingCostManager()
 void LLAccountingCostManager::accountingCostCoro(std::string url,
     eSelectionType selectionType, const LLHandle<LLAccountingCostObserver> observerHandle)
 {
-    LL_DEBUGS("LLAccountingCostManager") << "Entering coroutine " << LLCoros::instance().getName()
+    LL_DEBUGS("LLAccountingCostManager") << "Entering coroutine " << LLCoros::getName()
         << " with url '" << url << LL_ENDL;
 
     LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
@@ -158,7 +158,7 @@ void LLAccountingCostManager::accountingCostCoro(std::string url,
     }
     catch (...)
     {
-        LOG_UNHANDLED_EXCEPTION(STRINGIZE("coroutine " << LLCoros::instance().getName()
+        LOG_UNHANDLED_EXCEPTION(STRINGIZE("coroutine " << LLCoros::getName()
                                           << "('" << url << "')"));
         throw;
     }
diff --git a/indra/viewer_components/login/lllogin.cpp b/indra/viewer_components/login/lllogin.cpp
index 1a064593182baa0ad2b59c19411f9e2ccc4de038..57a7c035253c398ba8785ceb0c9204c0031bf37b 100644
--- a/indra/viewer_components/login/lllogin.cpp
+++ b/indra/viewer_components/login/lllogin.cpp
@@ -148,7 +148,7 @@ void LLLogin::Impl::loginCoro(std::string uri, LLSD login_params)
     }
     try
     {
-    LL_DEBUGS("LLLogin") << "Entering coroutine " << LLCoros::instance().getName()
+    LL_DEBUGS("LLLogin") << "Entering coroutine " << LLCoros::getName()
                         << " with uri '" << uri << "', parameters " << printable_params << LL_ENDL;
 
     LLEventPump& xmlrpcPump(LLEventPumps::instance().obtain("LLXMLRPCTransaction"));
@@ -307,7 +307,7 @@ void LLLogin::Impl::loginCoro(std::string uri, LLSD login_params)
     sendProgressEvent("offline", "fail.login", error_response);
     }
     catch (...) {
-        CRASH_ON_UNHANDLED_EXCEPTION(STRINGIZE("coroutine " << LLCoros::instance().getName()
+        CRASH_ON_UNHANDLED_EXCEPTION(STRINGIZE("coroutine " << LLCoros::getName()
                                                << "('" << uri << "', " << printable_params << ")"));
     }
 }