gecko-dev/netwerk/ipc/SocketProcessBridgeParent.cpp
Kershaw Chang 1c6a55798d Bug 1242221 - Close IPC channel before MessageLoop gets destroyed r=mayhemer
From the log, I found that the intermittent crash happened because SocketProcessBridgeParent's message loop is destroyed before the IPC channel is closed. Before this patch, the only way to close the IPC channel between SocketProcessBridgeParent and SocketProcessBridgeChild is relying on "content-child-shutdown" notification in child process. If socket process gets terminated before "content-child-shutdown", the IPC channel is never closed.
So, this patch tries to close the IPC channel at SocketProcessChild::CleanUp if the channel is not closed.

Differential Revision: https://phabricator.services.mozilla.com/D38287

--HG--
extra : moz-landing-system : lando
2019-07-25 15:24:02 +00:00

65 lines
2.1 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "SocketProcessBridgeParent.h"
#include "SocketProcessLogging.h"
#include "mozilla/ipc/BackgroundParent.h"
#include "SocketProcessChild.h"
namespace mozilla {
namespace net {
SocketProcessBridgeParent::SocketProcessBridgeParent(
ProcessId aId, Endpoint<PSocketProcessBridgeParent>&& aEndpoint)
: mId(aId), mClosed(false) {
LOG((
"CONSTRUCT SocketProcessBridgeParent::SocketProcessBridgeParent mId=%d\n",
mId));
MOZ_COUNT_CTOR(SocketProcessBridgeParent);
DebugOnly<bool> ok = aEndpoint.Bind(this);
MOZ_ASSERT(ok);
}
SocketProcessBridgeParent::~SocketProcessBridgeParent() {
LOG(("DESTRUCT SocketProcessBridgeParent::SocketProcessBridgeParent mId=%d\n",
mId));
MOZ_COUNT_DTOR(SocketProcessBridgeParent);
}
mozilla::ipc::IPCResult SocketProcessBridgeParent::RecvTest() {
LOG(("SocketProcessBridgeParent::RecvTest\n"));
Unused << SendTest();
return IPC_OK();
}
mozilla::ipc::IPCResult SocketProcessBridgeParent::RecvInitBackground(
Endpoint<PBackgroundParent>&& aEndpoint) {
LOG(("SocketProcessBridgeParent::RecvInitBackground mId=%d\n", mId));
if (!ipc::BackgroundParent::Alloc(nullptr, std::move(aEndpoint))) {
return IPC_FAIL(this, "BackgroundParent::Alloc failed");
}
return IPC_OK();
}
void SocketProcessBridgeParent::ActorDestroy(ActorDestroyReason aWhy) {
LOG(("SocketProcessBridgeParent::ActorDestroy mId=%d\n", mId));
mClosed = true;
MessageLoop::current()->PostTask(
NewRunnableMethod("net::SocketProcessBridgeParent::DeferredDestroy", this,
&SocketProcessBridgeParent::DeferredDestroy));
}
void SocketProcessBridgeParent::DeferredDestroy() {
if (SocketProcessChild* child = SocketProcessChild::GetSingleton()) {
child->DestroySocketProcessBridgeParent(mId);
}
}
} // namespace net
} // namespace mozilla