gecko-dev/netwerk/ipc/SocketProcessBridgeParent.h
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

45 lines
1.4 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/. */
#ifndef mozilla_net_SocketProcessBridgeParent_h
#define mozilla_net_SocketProcessBridgeParent_h
#include "mozilla/net/PSocketProcessBridgeParent.h"
namespace mozilla {
namespace net {
// The IPC actor implements PSocketProcessBridgeParent in socket process.
// This is allocated and kept alive by SocketProcessChild. When |ActorDestroy|
// is called, |SocketProcessChild::DestroySocketProcessBridgeParent| will be
// called to destroy this actor.
class SocketProcessBridgeParent final : public PSocketProcessBridgeParent {
public:
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(SocketProcessBridgeParent)
explicit SocketProcessBridgeParent(
ProcessId aId, Endpoint<PSocketProcessBridgeParent>&& aEndpoint);
mozilla::ipc::IPCResult RecvTest();
mozilla::ipc::IPCResult RecvInitBackground(
Endpoint<PBackgroundParent>&& aEndpoint);
void ActorDestroy(ActorDestroyReason aWhy) override;
void DeferredDestroy();
bool Closed() const { return mClosed; }
private:
~SocketProcessBridgeParent();
ProcessId mId;
bool mClosed;
};
} // namespace net
} // namespace mozilla
#endif // mozilla_net_SocketProcessBridgeParent_h