Do tail dispatch automatically

This commit is contained in:
trav90
2017-03-16 03:15:49 -05:00
committed by roytam1
parent a3d351f76a
commit 78e189b54a
4 changed files with 18 additions and 14 deletions
+6 -1
View File
@@ -30,8 +30,13 @@ public:
DispatchFailureHandling aFailureHandling = AssertDispatchSuccess,
DispatchReason aReason = NormalDispatch) override
{
MOZ_ASSERT_IF(aReason != TailDispatch, !CurrentThreadRequiresTailDispatch());
nsCOMPtr<nsIRunnable> r = aRunnable;
AbstractThread* currentThread;
if (aReason != TailDispatch && (currentThread = GetCurrent()) && currentThread->RequiresTailDispatch()) {
currentThread->TailDispatcher().AddTask(this, r.forget(), aFailureHandling);
return;
}
nsresult rv = mTarget->Dispatch(r, NS_DISPATCH_NORMAL);
MOZ_DIAGNOSTIC_ASSERT(aFailureHandling == DontAssertDispatchSuccess || NS_SUCCEEDED(rv));
unused << rv;
-8
View File
@@ -80,14 +80,6 @@ public:
// Must be called exactly once during startup.
static void InitStatics();
// Returns true if the currently-running thread is an AbstractThread that
// requires tail dispatch.
static bool CurrentThreadRequiresTailDispatch()
{
AbstractThread* current = GetCurrent();
return current && current->RequiresTailDispatch();
}
protected:
virtual ~AbstractThread() {}
static ThreadLocal<AbstractThread*> sCurrentThreadTLS;
+10 -4
View File
@@ -40,11 +40,17 @@ MediaTaskQueue::TailDispatcher()
nsresult
MediaTaskQueue::DispatchLocked(already_AddRefed<nsIRunnable> aRunnable,
DispatchMode aMode, DispatchReason aReason)
DispatchMode aMode, DispatchFailureHandling aFailureHandling,
DispatchReason aReason)
{
MOZ_ASSERT_IF(aReason != TailDispatch, !CurrentThreadRequiresTailDispatch());
mQueueMonitor.AssertCurrentThreadOwns();
nsCOMPtr<nsIRunnable> r = aRunnable;
AbstractThread* currentThread;
if (aReason != TailDispatch && (currentThread = GetCurrent()) && currentThread->RequiresTailDispatch()) {
currentThread->TailDispatcher().AddTask(this, r.forget(), aFailureHandling);
return NS_OK;
}
mQueueMonitor.AssertCurrentThreadOwns();
if (mIsFlushing && aMode == AbortIfFlushing) {
return NS_ERROR_ABORT;
}
@@ -161,7 +167,7 @@ FlushableMediaTaskQueue::FlushAndDispatch(TemporaryRef<nsIRunnable> aRunnable)
AutoSetFlushing autoFlush(this);
FlushLocked();
nsCOMPtr<nsIRunnable> r = dont_AddRef(aRunnable.take());
nsresult rv = DispatchLocked(r.forget(), IgnoreFlushing);
nsresult rv = DispatchLocked(r.forget(), IgnoreFlushing, AssertDispatchSuccess);
NS_ENSURE_SUCCESS(rv, rv);
AwaitIdleLocked();
return NS_OK;
+2 -1
View File
@@ -47,7 +47,7 @@ public:
DispatchReason aReason = NormalDispatch) override
{
MonitorAutoLock mon(mQueueMonitor);
nsresult rv = DispatchLocked(Move(aRunnable), AbortIfFlushing, aReason);
nsresult rv = DispatchLocked(Move(aRunnable), AbortIfFlushing, aFailureHandling, aReason);
MOZ_DIAGNOSTIC_ASSERT(aFailureHandling == DontAssertDispatchSuccess || NS_SUCCEEDED(rv));
unused << rv;
}
@@ -100,6 +100,7 @@ protected:
enum DispatchMode { AbortIfFlushing, IgnoreFlushing };
nsresult DispatchLocked(already_AddRefed<nsIRunnable> aRunnable, DispatchMode aMode,
DispatchFailureHandling aFailureHandling,
DispatchReason aReason = NormalDispatch);
RefPtr<SharedThreadPool> mPool;