gecko-dev/ipc/glue/BrowserProcessSubThread.cpp
Nika Layzell 4527652311 Bug 1706374 - Part 12a: Initialize NodeController when creating IO thread, r=handyman
This also consumes the existing channel created when launching a process to
create the the conneciton required by NodeController for communicating between
processes. In part 12b, consumers of the broken APIs will be adjusted to use
the new interface.

The new routing approach is not used for the fork server process, as an IO
thread and the NodeController object cannot be initialized before the fork has
been performed, and the IPC requirements of that process are fairly minimal.

Differential Revision: https://phabricator.services.mozilla.com/D112776
2021-06-22 18:17:22 +00:00

84 lines
2.1 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 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/. */
#include "mozilla/ipc/BrowserProcessSubThread.h"
#include "mozilla/ipc/NodeController.h"
#if defined(OS_WIN)
# include <objbase.h>
#endif
namespace mozilla {
namespace ipc {
//
// BrowserProcessSubThread
//
// Friendly names for the well-known threads.
static const char* kBrowserThreadNames[BrowserProcessSubThread::ID_COUNT] = {
"IPC I/O Parent", // IO
};
/* static */
StaticMutex BrowserProcessSubThread::sLock;
BrowserProcessSubThread* BrowserProcessSubThread::sBrowserThreads[ID_COUNT] = {
nullptr, // IO
};
BrowserProcessSubThread::BrowserProcessSubThread(ID aId)
: base::Thread(kBrowserThreadNames[aId]), mIdentifier(aId) {
StaticMutexAutoLock lock(sLock);
DCHECK(aId >= 0 && aId < ID_COUNT);
DCHECK(sBrowserThreads[aId] == nullptr);
sBrowserThreads[aId] = this;
}
BrowserProcessSubThread::~BrowserProcessSubThread() {
Stop();
{
StaticMutexAutoLock lock(sLock);
sBrowserThreads[mIdentifier] = nullptr;
}
}
void BrowserProcessSubThread::Init() {
#if defined(OS_WIN)
// Initializes the COM library on the current thread.
CoInitialize(nullptr);
#endif
// Initialize the ports library in the current thread.
if (mIdentifier == IO) {
NodeController::InitBrokerProcess();
}
}
void BrowserProcessSubThread::CleanUp() {
if (mIdentifier == IO) {
NodeController::CleanUp();
}
#if defined(OS_WIN)
// Closes the COM library on the current thread. CoInitialize must
// be balanced by a corresponding call to CoUninitialize.
CoUninitialize();
#endif
}
// static
MessageLoop* BrowserProcessSubThread::GetMessageLoop(ID aId) {
StaticMutexAutoLock lock(sLock);
DCHECK(aId >= 0 && aId < ID_COUNT);
if (sBrowserThreads[aId]) return sBrowserThreads[aId]->message_loop();
return nullptr;
}
} // namespace ipc
} // namespace mozilla