Bug 1453971 - ReleasingTimerHolder::Create should use a timer to avoid nsIAsyncShutdownBlocker (implemented in JS) to run during stable state, r=smaug

This commit is contained in:
Andrea Marchesini 2018-05-22 17:50:25 +02:00
Родитель 1f74824f6b
Коммит 5cc80bc69f
1 изменённых файлов: 32 добавлений и 20 удалений

Просмотреть файл

@ -419,12 +419,12 @@ class BlobURLsReporter final : public nsIMemoryReporter
NS_IMPL_ISUPPORTS(BlobURLsReporter, nsIMemoryReporter)
class ReleasingTimerHolder final : public nsITimerCallback
, public nsINamed
class ReleasingTimerHolder final : public Runnable
, public nsITimerCallback
, public nsIAsyncShutdownBlocker
{
public:
NS_DECL_ISUPPORTS
NS_DECL_ISUPPORTS_INHERITED
static void
Create(const nsACString& aURI, bool aBroadcastToOtherProcesses)
@ -438,22 +438,40 @@ public:
holder->CancelTimerAndRevokeURI();
});
nsresult rv = NS_NewTimerWithCallback(getter_AddRefs(holder->mTimer),
holder, RELEASING_TIMER,
nsITimer::TYPE_ONE_SHOT,
SystemGroup::EventTargetFor(TaskCategory::Other));
NS_ENSURE_SUCCESS_VOID(rv);
nsCOMPtr<nsIAsyncShutdownClient> phase = GetShutdownPhase();
NS_ENSURE_TRUE_VOID(!!phase);
rv = phase->AddBlocker(holder, NS_LITERAL_STRING(__FILE__), __LINE__,
NS_LITERAL_STRING("ReleasingTimerHolder shutdown"));
nsresult rv =
SystemGroup::EventTargetFor(TaskCategory::Other)->Dispatch(holder.forget());
NS_ENSURE_SUCCESS_VOID(rv);
raii.release();
}
// Runnable interface
NS_IMETHOD
Run() override
{
RefPtr<ReleasingTimerHolder> self = this;
auto raii = mozilla::MakeScopeExit([self] {
self->CancelTimerAndRevokeURI();
});
nsresult rv = NS_NewTimerWithCallback(getter_AddRefs(mTimer),
this, RELEASING_TIMER,
nsITimer::TYPE_ONE_SHOT,
SystemGroup::EventTargetFor(TaskCategory::Other));
NS_ENSURE_SUCCESS(rv, NS_OK);
nsCOMPtr<nsIAsyncShutdownClient> phase = GetShutdownPhase();
NS_ENSURE_TRUE(!!phase, NS_OK);
rv = phase->AddBlocker(this, NS_LITERAL_STRING(__FILE__), __LINE__,
NS_LITERAL_STRING("ReleasingTimerHolder shutdown"));
NS_ENSURE_SUCCESS(rv, NS_OK);
raii.release();
return NS_OK;
}
// nsITimerCallback interface
NS_IMETHOD
@ -463,14 +481,7 @@ public:
return NS_OK;
}
// nsINamed interface
NS_IMETHOD
GetName(nsACString& aName) override
{
aName.AssignLiteral("ReleasingTimerHolder");
return NS_OK;
}
using nsINamed::GetName;
// nsIAsyncShutdownBlocker interface
@ -497,7 +508,8 @@ public:
private:
ReleasingTimerHolder(const nsACString& aURI, bool aBroadcastToOtherProcesses)
: mURI(aURI)
: Runnable("ReleasingTimerHolder")
, mURI(aURI)
, mBroadcastToOtherProcesses(aBroadcastToOtherProcesses)
{}
@ -563,7 +575,7 @@ private:
nsCOMPtr<nsITimer> mTimer;
};
NS_IMPL_ISUPPORTS(ReleasingTimerHolder, nsITimerCallback, nsINamed,
NS_IMPL_ISUPPORTS_INHERITED(ReleasingTimerHolder, Runnable, nsITimerCallback,
nsIAsyncShutdownBlocker)
} // namespace mozilla