Bug 1283616 - part 2 - micro-optimize inserting microtask runnables into the queue; r=khuey

We can save an AddRef/Release pair by passing in the reference to the queue.
This commit is contained in:
Nathan Froyd 2016-07-05 18:49:06 -04:00
parent 985851ccca
commit 2c2b9296bc
5 changed files with 17 additions and 13 deletions

View File

@ -1252,8 +1252,8 @@ Animation::DoFinishNotification(SyncNotifyFlag aSyncNotifyFlag)
} else if (!mFinishNotificationTask.IsPending()) {
RefPtr<nsRunnableMethod<Animation>> runnable =
NewRunnableMethod(this, &Animation::DoFinishNotificationImmediately);
runtime->DispatchToMicroTask(runnable);
mFinishNotificationTask = runnable;
runtime->DispatchToMicroTask(do_AddRef(runnable));
mFinishNotificationTask = runnable.forget();
}
}

View File

@ -2697,7 +2697,7 @@ Promise::ResolveInternal(JSContext* aCx,
new PromiseInit(nullptr, thenObj, mozilla::dom::GetIncumbentGlobal());
RefPtr<PromiseResolveThenableJob> task =
new PromiseResolveThenableJob(this, valueObj, thenCallback);
runtime->DispatchToMicroTask(task);
runtime->DispatchToMicroTask(task.forget());
return;
}
}
@ -2812,7 +2812,7 @@ Promise::TriggerPromiseReactions()
for (uint32_t i = 0; i < callbacks.Length(); ++i) {
RefPtr<PromiseReactionJob> task =
new PromiseReactionJob(this, callbacks[i], mResult);
runtime->DispatchToMicroTask(task);
runtime->DispatchToMicroTask(task.forget());
}
}

View File

@ -948,10 +948,12 @@ public:
}
}
virtual void DispatchToMicroTask(nsIRunnable* aRunnable) override
virtual void DispatchToMicroTask(already_AddRefed<nsIRunnable> aRunnable) override
{
RefPtr<nsIRunnable> runnable(aRunnable);
MOZ_ASSERT(!NS_IsMainThread());
MOZ_ASSERT(aRunnable);
MOZ_ASSERT(runnable);
std::queue<nsCOMPtr<nsIRunnable>>* microTaskQueue = nullptr;
@ -973,7 +975,7 @@ public:
microTaskQueue = &mDebuggerPromiseMicroTaskQueue;
}
microTaskQueue->push(aRunnable);
microTaskQueue->push(runnable.forget());
}
private:

View File

@ -975,7 +975,7 @@ CycleCollectedJSRuntime::EnqueuePromiseJobCallback(JSContext* aCx,
global = xpc::NativeGlobal(aIncumbentGlobal);
}
nsCOMPtr<nsIRunnable> runnable = new PromiseJobRunnable(aJob, aAllocationSite, global);
self->DispatchToMicroTask(runnable);
self->DispatchToMicroTask(runnable.forget());
return true;
}
@ -1680,12 +1680,14 @@ CycleCollectedJSRuntime::PrepareWaitingZonesForGC()
}
void
CycleCollectedJSRuntime::DispatchToMicroTask(nsIRunnable* aRunnable)
CycleCollectedJSRuntime::DispatchToMicroTask(already_AddRefed<nsIRunnable> aRunnable)
{
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aRunnable);
RefPtr<nsIRunnable> runnable(aRunnable);
mPromiseMicroTaskQueue.push(aRunnable);
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(runnable);
mPromiseMicroTaskQueue.push(runnable.forget());
}
void

View File

@ -372,7 +372,7 @@ public:
void PrepareWaitingZonesForGC();
// Queue an async microtask to the current main or worker thread.
virtual void DispatchToMicroTask(nsIRunnable* aRunnable);
virtual void DispatchToMicroTask(already_AddRefed<nsIRunnable> aRunnable);
// Storage for watching rejected promises waiting for some client to
// consume their rejection.