mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-12-01 00:32:11 +00:00
f51f359297
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
47 lines
1.2 KiB
C++
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_
|