Bug 1119956 implement IdleRunnableWrapper::OnDiscard() r=sg

This causes no behavior changes in the current code because existing runnables
passed to NS_DispatchToThreadQueue() are either run on the main thread where
OnDiscard() is not called or they have only a no-op OnDiscard().

Differential Revision: https://phabricator.services.mozilla.com/D98120
This commit is contained in:
Karl Tomlinson 2020-12-06 21:51:01 +00:00
parent 62b526e960
commit d508bddd4f

View File

@ -342,20 +342,38 @@ extern nsresult NS_DispatchToMainThreadQueue(
return rv;
}
class IdleRunnableWrapper final : public IdleRunnable {
class IdleRunnableWrapper final : public Runnable,
public nsIDiscardableRunnable,
public nsIIdleRunnable {
public:
explicit IdleRunnableWrapper(already_AddRefed<nsIRunnable>&& aEvent)
: mRunnable(std::move(aEvent)) {}
: Runnable("IdleRunnableWrapper"),
mRunnable(std::move(aEvent)),
mDiscardable(do_QueryInterface(mRunnable)) {}
NS_DECL_ISUPPORTS_INHERITED
NS_IMETHOD Run() override {
if (!mRunnable) {
return NS_OK;
}
CancelTimer();
// Don't clear mDiscardable because that would cause QueryInterface to
// change behavior during the lifetime of an instance.
nsCOMPtr<nsIRunnable> runnable = std::move(mRunnable);
return runnable->Run();
}
// nsIDiscardableRunnable
void OnDiscard() override {
if (!mRunnable) {
// Run() was already called from TimedOut().
return;
}
mDiscardable->OnDiscard();
mRunnable = nullptr;
}
static void TimedOut(nsITimer* aTimer, void* aClosure) {
RefPtr<IdleRunnableWrapper> runnable =
static_cast<IdleRunnableWrapper*>(aClosure);
@ -398,8 +416,17 @@ class IdleRunnableWrapper final : public IdleRunnable {
nsCOMPtr<nsITimer> mTimer;
nsCOMPtr<nsIRunnable> mRunnable;
nsCOMPtr<nsIDiscardableRunnable> mDiscardable;
};
NS_IMPL_ADDREF_INHERITED(IdleRunnableWrapper, Runnable)
NS_IMPL_RELEASE_INHERITED(IdleRunnableWrapper, Runnable)
NS_INTERFACE_MAP_BEGIN(IdleRunnableWrapper)
NS_INTERFACE_MAP_ENTRY(nsIIdleRunnable)
NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIDiscardableRunnable, mDiscardable)
NS_INTERFACE_MAP_END_INHERITING(Runnable)
extern nsresult NS_DispatchToThreadQueue(already_AddRefed<nsIRunnable>&& aEvent,
uint32_t aTimeout, nsIThread* aThread,
EventQueuePriority aQueue) {