Bug 1303940 - MessageLoop::PostDelayedTask() should schedule the runnable on the target thread instead of the current thread. r?nfroyd draft
authorCervantes Yu <cyu@mozilla.com>
Tue, 20 Sep 2016 14:00:18 +0800
changeset 415331 9e6350ce69c314860731334e7fcd69cc26df6e8d
parent 415258 c9971be9e98150ef99d4ef80c6f800ec5915b1ac
child 531589 6436e004818d457cdb1707bc2922080097bcb076
push id29850
push usercyu@mozilla.com
push dateTue, 20 Sep 2016 06:32:29 +0000
reviewersnfroyd
bugs1303940
milestone52.0a1
Bug 1303940 - MessageLoop::PostDelayedTask() should schedule the runnable on the target thread instead of the current thread. r?nfroyd MozReview-Commit-ID: 8yCY9WSwbAJ
xpcom/threads/nsThread.cpp
--- a/xpcom/threads/nsThread.cpp
+++ b/xpcom/threads/nsThread.cpp
@@ -225,32 +225,37 @@ private:
 };
 //-----------------------------------------------------------------------------
 
 namespace {
 class DelayedRunnable : public Runnable,
                         public nsITimerCallback
 {
 public:
-  DelayedRunnable(already_AddRefed<nsIRunnable> aRunnable,
+  DelayedRunnable(already_AddRefed<nsIThread> aTargetThread,
+                  already_AddRefed<nsIRunnable> aRunnable,
                   uint32_t aDelay)
-    : mWrappedRunnable(aRunnable),
+    : mTargetThread(aTargetThread),
+      mWrappedRunnable(aRunnable),
       mDelayedFrom(TimeStamp::NowLoRes()),
       mDelay(aDelay)
   { }
 
   NS_DECL_ISUPPORTS_INHERITED
 
   nsresult Init()
   {
     nsresult rv;
     mTimer = do_CreateInstance(NS_TIMER_CONTRACTID, &rv);
     NS_ENSURE_SUCCESS(rv, rv);
 
     MOZ_ASSERT(mTimer);
+    rv = mTimer->SetTarget(mTargetThread);
+
+    NS_ENSURE_SUCCESS(rv, rv);
     return mTimer->InitWithCallback(this, mDelay, nsITimer::TYPE_ONE_SHOT);
   }
 
   nsresult DoRun()
   {
     nsCOMPtr<nsIRunnable> r = mWrappedRunnable.forget();
     return r->Run();
   }
@@ -278,16 +283,17 @@ public:
     MOZ_ASSERT(aTimer == mTimer);
 
     return DoRun();
   }
 
 private:
   ~DelayedRunnable() {}
 
+  nsCOMPtr<nsIThread> mTargetThread;
   nsCOMPtr<nsIRunnable> mWrappedRunnable;
   nsCOMPtr<nsITimer> mTimer;
   TimeStamp mDelayedFrom;
   uint32_t mDelay;
 };
 
 NS_IMPL_ISUPPORTS_INHERITED(DelayedRunnable, Runnable, nsITimerCallback)
 
@@ -771,17 +777,19 @@ nsThread::Dispatch(already_AddRefed<nsIR
   return DispatchInternal(Move(aEvent), aFlags, nullptr);
 }
 
 NS_IMETHODIMP
 nsThread::DelayedDispatch(already_AddRefed<nsIRunnable> aEvent, uint32_t aDelayMs)
 {
   NS_ENSURE_TRUE(!!aDelayMs, NS_ERROR_UNEXPECTED);
 
-  RefPtr<DelayedRunnable> r = new DelayedRunnable(Move(aEvent), aDelayMs);
+  RefPtr<DelayedRunnable> r = new DelayedRunnable(Move(do_AddRef(this)),
+                                                  Move(aEvent),
+                                                  aDelayMs);
   nsresult rv = r->Init();
   NS_ENSURE_SUCCESS(rv, rv);
 
   return DispatchInternal(r.forget(), 0, nullptr);
 }
 
 NS_IMETHODIMP
 nsThread::IsOnCurrentThread(bool* aResult)