gecko-dev/netwerk/ipc/SocketProcessBridgeParent.cpp
Nika Layzell f2916bb759 Bug 1737828 - Avoid the main thread when starting PBackground, r=asuth,ipc-reviewers,necko-reviewers,kershaw,handyman
This patch avoids requiring the main thread to create PBackground instances by
instead using a background starter TaskQueue, and sending messages from a
PBackgroundStarter actor hosted on that thread to the target background thread
directly. On the background thread, the relevant metadata is already registered
and present in the BackgroundStarterParent actor allowing the main thread in
both processes to be bypassed completely.

Various tasks remain bound to the main thread, such as PBackground cleanup and
async steps involved in PBackground creation.

This patch also unifies the in-process and cross-process PBackground codepaths,
allowing in-process PBackground creation to bypass the main thread as well, and
removing the need for a main thread event target from
GetOrCreateForCurrentThread().

Differential Revision: https://phabricator.services.mozilla.com/D129705
2022-01-10 20:09:14 +00:00

66 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 "mozilla/ipc/Endpoint.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<PBackgroundStarterParent>&& aEndpoint) {
LOG(("SocketProcessBridgeParent::RecvInitBackground mId=%d\n", mId));
if (!ipc::BackgroundParent::AllocStarter(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;
GetCurrentSerialEventTarget()->Dispatch(
NewRunnableMethod("net::SocketProcessBridgeParent::DeferredDestroy", this,
&SocketProcessBridgeParent::DeferredDestroy));
}
void SocketProcessBridgeParent::DeferredDestroy() {
if (SocketProcessChild* child = SocketProcessChild::GetSingleton()) {
child->DestroySocketProcessBridgeParent(mId);
}
}
} // namespace net
} // namespace mozilla