gecko-dev/ipc/glue/ForkServer.h
Nika Layzell f51f359297 Bug 1792474 - Part 3: Stop using IPC::Channel to create the pipe for ForkServer, r=ipc-reviewers,jld
Previously the channel used by the ForkServer would be created using
IPC::Channel, and then stolen after the launch was successful. Unfortunately,
this required invoking IPC::Channel methods (such as `Close()`) from the wrong
thread, and so would be racy and hit assertions with the new checks being
added. This patch instead skips creating the IPC::Channel for the fork server,
and allows it to create and configure its own pipe as needed.

This may be used in the future to change out the IPC strategy for the fork
server to something more appropriate, which supports features like async
replies as forked processes die.

Differential Revision: https://phabricator.services.mozilla.com/D158161
2022-10-07 01:51:29 +00:00

47 lines
1.2 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* vim: set ts=8 sts=4 et sw=4 tw=80: */
/* 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 __FORKSERVER_H_
#define __FORKSERVER_H_
#include "mozilla/UniquePtr.h"
#include "base/process_util.h"
#include "mozilla/ipc/MiniTransceiver.h"
namespace mozilla {
namespace ipc {
class ForkServer {
public:
// NOTE: This can re-use the same ID as the initial IPC::Channel, as the
// initial IPC::Channel will not be used by the fork server.
static constexpr int kClientPipeFd = 3;
ForkServer();
~ForkServer(){};
void InitProcess(int* aArgc, char*** aArgv);
bool HandleMessages();
// Called when a message is received.
void OnMessageReceived(UniquePtr<IPC::Message> message);
static bool RunForkServer(int* aArgc, char*** aArgv);
private:
UniquePtr<MiniTransceiver> mTcver;
UniquePtr<base::AppProcessBuilder> mAppProcBuilder;
};
enum {
Msg_ForkNewSubprocess__ID = 0x7f0, // a random picked number
Reply_ForkNewSubprocess__ID,
};
} // namespace ipc
} // namespace mozilla
#endif // __FORKSERVER_H_