Bug 1303940 - MessageLoop::PostDelayedTask() should schedule the runnable on the target thread instead of the current thread. r?nfroyd
MozReview-Commit-ID: 8yCY9WSwbAJ
--- 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)