зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1488260 Part 2 - Cleanly shutdown when message forwarding fails, r=mccr8.
--HG-- extra : rebase_source : ceb20246e2a6bc44e7141234f04f61d3ef74f381
This commit is contained in:
Родитель
4a3bf67bb5
Коммит
dc537cbc89
|
@ -147,6 +147,15 @@ struct MOZ_RAII AutoMarkMainThreadWaitingForIPDLReply
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
BeginShutdown()
|
||||||
|
{
|
||||||
|
// If there is a channel error or anything that could result from the child
|
||||||
|
// crashing, cleanly shutdown this process so that we don't generate a
|
||||||
|
// separate minidump which masks the initial failure.
|
||||||
|
MainThreadMessageLoop()->PostTask(NewRunnableFunction("Shutdown", Shutdown));
|
||||||
|
}
|
||||||
|
|
||||||
class MiddlemanProtocol : public ipc::IToplevelProtocol
|
class MiddlemanProtocol : public ipc::IToplevelProtocol
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -172,7 +181,8 @@ public:
|
||||||
IPC::StringFromIPCMessageType(aMessage->type()),
|
IPC::StringFromIPCMessageType(aMessage->type()),
|
||||||
(int) aMessage->routing_id());
|
(int) aMessage->routing_id());
|
||||||
if (!aProtocol->GetIPCChannel()->Send(aMessage)) {
|
if (!aProtocol->GetIPCChannel()->Send(aMessage)) {
|
||||||
MOZ_CRASH("MiddlemanProtocol::ForwardMessageAsync");
|
MOZ_RELEASE_ASSERT(aProtocol->mSide == ipc::ParentSide);
|
||||||
|
BeginShutdown();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
delete aMessage;
|
delete aMessage;
|
||||||
|
@ -209,7 +219,8 @@ public:
|
||||||
MOZ_RELEASE_ASSERT(!*aReply);
|
MOZ_RELEASE_ASSERT(!*aReply);
|
||||||
Message* nReply = new Message();
|
Message* nReply = new Message();
|
||||||
if (!aProtocol->GetIPCChannel()->Send(aMessage, nReply)) {
|
if (!aProtocol->GetIPCChannel()->Send(aMessage, nReply)) {
|
||||||
MOZ_CRASH("MiddlemanProtocol::ForwardMessageSync");
|
MOZ_RELEASE_ASSERT(aProtocol->mSide == ipc::ParentSide);
|
||||||
|
BeginShutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
MonitorAutoLock lock(*gMonitor);
|
MonitorAutoLock lock(*gMonitor);
|
||||||
|
@ -245,7 +256,8 @@ public:
|
||||||
MOZ_RELEASE_ASSERT(!*aReply);
|
MOZ_RELEASE_ASSERT(!*aReply);
|
||||||
Message* nReply = new Message();
|
Message* nReply = new Message();
|
||||||
if (!aProtocol->GetIPCChannel()->Call(aMessage, nReply)) {
|
if (!aProtocol->GetIPCChannel()->Call(aMessage, nReply)) {
|
||||||
MOZ_CRASH("MiddlemanProtocol::ForwardCallMessage");
|
MOZ_RELEASE_ASSERT(aProtocol->mSide == ipc::ParentSide);
|
||||||
|
BeginShutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
MonitorAutoLock lock(*gMonitor);
|
MonitorAutoLock lock(*gMonitor);
|
||||||
|
@ -281,11 +293,11 @@ public:
|
||||||
|
|
||||||
virtual void OnChannelClose() override {
|
virtual void OnChannelClose() override {
|
||||||
MOZ_RELEASE_ASSERT(mSide == ipc::ChildSide);
|
MOZ_RELEASE_ASSERT(mSide == ipc::ChildSide);
|
||||||
MainThreadMessageLoop()->PostTask(NewRunnableFunction("Shutdown", Shutdown));
|
BeginShutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void OnChannelError() override {
|
virtual void OnChannelError() override {
|
||||||
MainThreadMessageLoop()->PostTask(NewRunnableFunction("Shutdown", Shutdown));
|
BeginShutdown();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче