Bug 1268559 - Add a safety shutdown timer in ContentChild. r=billm

MozReview-Commit-ID: FVnOvJzErpI
This commit is contained in:
Jim Mathies 2016-06-02 07:52:17 -05:00
Родитель 2ef0f525fd
Коммит d9d8c491ff
2 изменённых файлов: 38 добавлений и 0 удалений

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

@ -2250,6 +2250,11 @@ ContentChild::RecvSetConnectivity(const bool& connectivity)
void
ContentChild::ActorDestroy(ActorDestroyReason why)
{
if (mForceKillTimer) {
mForceKillTimer->Cancel();
mForceKillTimer = nullptr;
}
if (AbnormalShutdown == why) {
NS_WARNING("shutting down early because of crash!");
ProcessChild::QuickExit();
@ -3026,6 +3031,30 @@ ContentChild::RecvDomainSetChanged(const uint32_t& aSetType,
return true;
}
void
ContentChild::StartForceKillTimer()
{
if (mForceKillTimer) {
return;
}
int32_t timeoutSecs = Preferences::GetInt("dom.ipc.tabs.shutdownTimeoutSecs", 5);
if (timeoutSecs > 0) {
mForceKillTimer = do_CreateInstance("@mozilla.org/timer;1");
MOZ_ASSERT(mForceKillTimer);
mForceKillTimer->InitWithFuncCallback(ContentChild::ForceKillTimerCallback,
this,
timeoutSecs * 1000,
nsITimer::TYPE_ONE_SHOT);
}
}
/* static */ void
ContentChild::ForceKillTimerCallback(nsITimer* aTimer, void* aClosure)
{
ProcessChild::QuickExit();
}
bool
ContentChild::RecvShutdown()
{
@ -3055,6 +3084,11 @@ ContentChild::RecvShutdown()
}
#endif
// Start a timer that will insure we quickly exit after a reasonable
// period of time. Prevents shutdown hangs after our connection to the
// parent closes.
StartForceKillTimer();
// Ignore errors here. If this fails, the parent will kill us after a
// timeout.
Unused << SendFinishShutdown();

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

@ -615,6 +615,9 @@ public:
const nsString& aIconPath) override;
private:
static void ForceKillTimerCallback(nsITimer* aTimer, void* aClosure);
void StartForceKillTimer();
virtual void ActorDestroy(ActorDestroyReason why) override;
virtual void ProcessingError(Result aCode, const char* aReason) override;
@ -646,6 +649,7 @@ private:
static ContentChild* sSingleton;
nsCOMPtr<nsIDomainPolicy> mPolicy;
nsCOMPtr<nsITimer> mForceKillTimer;
DISALLOW_EVIL_CONSTRUCTORS(ContentChild);
};