diff --git a/indra/llcommon/llcoros.cpp b/indra/llcommon/llcoros.cpp
index 23419a52a757a020808e454e315cd3185948b6a7..7ad10f206eb9e197e311a4b192e483841114049c 100644
--- a/indra/llcommon/llcoros.cpp
+++ b/indra/llcommon/llcoros.cpp
@@ -131,6 +131,13 @@ LLCoros::LLCoros():
 
 LLCoros::~LLCoros()
 {
+}
+
+void LLCoros::cleanupSingleton()
+{
+    // Some of the coroutines (like voice) will depend onto
+    // origin singletons, so clean coros before deleting those
+
     printActiveCoroutines("at entry to ~LLCoros()");
     // Other LLApp status-change listeners do things like close
     // work queues and inject the Stop exception into pending
@@ -146,6 +153,8 @@ LLCoros::~LLCoros()
     {
         // don't use llcoro::suspend() because that module depends
         // on this one
+        // This will yield current(main) thread and will let active
+        // corutines run once
         boost::this_fiber::yield();
     }
     printActiveCoroutines("after pumping");
diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h
index 38c2356c99d8bf41df4bec38f4ef98f7a8b4ab71..51f7380def9e465f21c5c330b336a2779d51877b 100644
--- a/indra/llcommon/llcoros.h
+++ b/indra/llcommon/llcoros.h
@@ -89,6 +89,8 @@ class LL_COMMON_API LLCoros: public LLSingleton<LLCoros>
 {
     LLSINGLETON(LLCoros);
     ~LLCoros();
+
+    void cleanupSingleton();
 public:
     /// The viewer's use of the term "coroutine" became deeply embedded before
     /// the industry term "fiber" emerged to distinguish userland threads from