mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-06-08 17:39:19 +00:00
Do tail dispatch automatically
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user