mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-07 09:54:42 +00:00
f2916bb759
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
66 lines
2.1 KiB
C++
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
|