Bug 1413356: dispatch inside SingletonThreadHolder if needed. r?jesup draft
authorNils Ohlmeier [:drno] <drno@ohlmeier.org>
Mon, 30 Oct 2017 20:13:34 -0700
changeset 689775 e3b5039d5420dda6e8a59528aa33825b4a26582d
parent 689772 627ee86723b6bac1dea67c765065e5120bb7df03
child 738388 e0d610f24e1162641d6d9f0419125327d0c9aae4
push id87103
push userdrno@ohlmeier.org
push dateTue, 31 Oct 2017 22:59:20 +0000
reviewersjesup
bugs1413356
milestone58.0a1
Bug 1413356: dispatch inside SingletonThreadHolder if needed. r?jesup MozReview-Commit-ID: 8u7v2nKs09P
media/mtransport/nr_socket_prsock.cpp
--- a/media/mtransport/nr_socket_prsock.cpp
+++ b/media/mtransport/nr_socket_prsock.cpp
@@ -205,20 +205,25 @@ public:
   }
 
   /*
    * Keep track of how many instances are using a SingletonThreadHolder.
    * When no one is using it, shut it down
    */
   void AddUse()
   {
-    RUN_ON_THREAD(mParentThread,
+    // only dispatch if we are on the wrong thread
+    if (mParentThread == NS_GetCurrentThread()) {
+      AddUse_i();
+    } else {
+      mParentThread->Dispatch(
                   mozilla::WrapRunnable(RefPtr<SingletonThreadHolder>(this),
                                         &SingletonThreadHolder::AddUse_i),
                   NS_DISPATCH_SYNC);
+    }
   }
 
   void AddUse_i()
   {
     MOZ_ASSERT(int32_t(mUseCount) >= 0, "illegal refcnt");
     nsrefcnt count = ++mUseCount;
     if (count == 1) {
       // idle -> in-use
@@ -228,20 +233,25 @@ public:
       r_log(LOG_GENERIC,LOG_DEBUG,"Created wrapped SingletonThread %p",
             mThread.get());
     }
     r_log(LOG_GENERIC,LOG_DEBUG,"AddUse_i: %lu", (unsigned long) count);
   }
 
   void ReleaseUse()
   {
-    RUN_ON_THREAD(mParentThread,
-                  mozilla::WrapRunnable(RefPtr<SingletonThreadHolder>(this),
-                                        &SingletonThreadHolder::ReleaseUse_i),
-                  NS_DISPATCH_SYNC);
+    // only dispatch if we are on the wrong thread
+    if (mParentThread == NS_GetCurrentThread()) {
+      ReleaseUse_i();
+    } else {
+      mParentThread->Dispatch(
+                    mozilla::WrapRunnable(RefPtr<SingletonThreadHolder>(this),
+                                          &SingletonThreadHolder::ReleaseUse_i),
+                    NS_DISPATCH_SYNC);
+    }
   }
 
   void ReleaseUse_i()
   {
     MOZ_ASSERT(mParentThread == NS_GetCurrentThread());
     nsrefcnt count = --mUseCount;
     MOZ_ASSERT(int32_t(mUseCount) >= 0, "illegal refcnt");
     if (mThread && count == 0) {