From 78e189b54ab07cb6f2dcb2d14ce321cdfe226c68 Mon Sep 17 00:00:00 2001 From: trav90 Date: Thu, 16 Mar 2017 03:15:49 -0500 Subject: [PATCH] Do tail dispatch automatically --- dom/media/AbstractThread.cpp | 7 ++++++- dom/media/AbstractThread.h | 8 -------- dom/media/MediaTaskQueue.cpp | 14 ++++++++++---- dom/media/MediaTaskQueue.h | 3 ++- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/dom/media/AbstractThread.cpp b/dom/media/AbstractThread.cpp index 9be70c1ffa..9d9c60c7cc 100644 --- a/dom/media/AbstractThread.cpp +++ b/dom/media/AbstractThread.cpp @@ -30,8 +30,13 @@ public: DispatchFailureHandling aFailureHandling = AssertDispatchSuccess, DispatchReason aReason = NormalDispatch) override { - MOZ_ASSERT_IF(aReason != TailDispatch, !CurrentThreadRequiresTailDispatch()); nsCOMPtr 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; diff --git a/dom/media/AbstractThread.h b/dom/media/AbstractThread.h index 95155b39c9..7fd4b8377e 100644 --- a/dom/media/AbstractThread.h +++ b/dom/media/AbstractThread.h @@ -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 sCurrentThreadTLS; diff --git a/dom/media/MediaTaskQueue.cpp b/dom/media/MediaTaskQueue.cpp index 12391b3a19..f1e33d73e6 100644 --- a/dom/media/MediaTaskQueue.cpp +++ b/dom/media/MediaTaskQueue.cpp @@ -40,11 +40,17 @@ MediaTaskQueue::TailDispatcher() nsresult MediaTaskQueue::DispatchLocked(already_AddRefed aRunnable, - DispatchMode aMode, DispatchReason aReason) + DispatchMode aMode, DispatchFailureHandling aFailureHandling, + DispatchReason aReason) { - MOZ_ASSERT_IF(aReason != TailDispatch, !CurrentThreadRequiresTailDispatch()); - mQueueMonitor.AssertCurrentThreadOwns(); nsCOMPtr 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 aRunnable) AutoSetFlushing autoFlush(this); FlushLocked(); nsCOMPtr 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; diff --git a/dom/media/MediaTaskQueue.h b/dom/media/MediaTaskQueue.h index 9c3d0d2210..aadcbad0f9 100644 --- a/dom/media/MediaTaskQueue.h +++ b/dom/media/MediaTaskQueue.h @@ -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 aRunnable, DispatchMode aMode, + DispatchFailureHandling aFailureHandling, DispatchReason aReason = NormalDispatch); RefPtr mPool;