Bug 1225731 - Early bailout from TaskQueue::DispatchLocked(). r?froydnj draft
authorJW Wang <jwwang@mozilla.com>
Thu, 10 Nov 2016 15:45:45 +0800
changeset 437018 72e72898ca1a789f5509fc3ab95d7e50e2ca6906
parent 437017 b609c757cd683a5cb3ed9e926a92475379a50ca7
child 437048 3f7143cbd5de04e41103e7b93306305ab764d35f
push id35287
push userjwwang@mozilla.com
push dateThu, 10 Nov 2016 07:46:10 +0000
reviewersfroydnj
bugs1225731
milestone52.0a1
Bug 1225731 - Early bailout from TaskQueue::DispatchLocked(). r?froydnj MozReview-Commit-ID: Xhj87WeRID
xpcom/threads/TaskQueue.cpp
--- a/xpcom/threads/TaskQueue.cpp
+++ b/xpcom/threads/TaskQueue.cpp
@@ -90,26 +90,27 @@ TaskQueue::TailDispatcher()
 
 // Note aRunnable is passed by ref to support conditional ownership transfer.
 // See Dispatch() in TaskQueue.h for more details.
 nsresult
 TaskQueue::DispatchLocked(nsCOMPtr<nsIRunnable>& aRunnable,
                           DispatchFailureHandling aFailureHandling,
                           DispatchReason aReason)
 {
+  mQueueMonitor.AssertCurrentThreadOwns();
+  if (mIsShutdown) {
+    return NS_ERROR_FAILURE;
+  }
+
   AbstractThread* currentThread;
   if (aReason != TailDispatch && (currentThread = GetCurrent()) && RequiresTailDispatch(currentThread)) {
     currentThread->TailDispatcher().AddTask(this, aRunnable.forget(), aFailureHandling);
     return NS_OK;
   }
 
-  mQueueMonitor.AssertCurrentThreadOwns();
-  if (mIsShutdown) {
-    return NS_ERROR_FAILURE;
-  }
   mTasks.push(aRunnable.forget());
   if (mIsRunning) {
     return NS_OK;
   }
   RefPtr<nsIRunnable> runner(new Runner(this));
   nsresult rv = mTarget->Dispatch(runner.forget(), NS_DISPATCH_NORMAL);
   if (NS_FAILED(rv)) {
     NS_WARNING("Failed to dispatch runnable to run TaskQueue");