88 lines
2.6 KiB
C++
88 lines
2.6 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/. */
|
|
|
|
#ifndef mozilla_ipc_IOThreadParent_h
|
|
#define mozilla_ipc_IOThreadParent_h
|
|
|
|
#include "base/thread.h"
|
|
#include "chrome/common/ipc_channel.h"
|
|
#include "mozilla/ipc/ScopedPort.h"
|
|
|
|
namespace mozilla::ipc {
|
|
|
|
// Abstract background thread used for IPC I/O.
|
|
class IOThread : private base::Thread {
|
|
public:
|
|
// Lifecycle Note: The IOThread is stored in a static, and is returned by raw
|
|
// pointer here from potentially any thread. This is OK because the IOThread
|
|
// is very long lived, and should outlive any other thread which would
|
|
// reference it (other than the main thread, which is responsible for the
|
|
// lifetime of the IO Thread).
|
|
static IOThread* Get() { return sSingleton; }
|
|
|
|
// Get the nsISerialEventTarget which should be used to dispatch events to run
|
|
// on the IOThreadBase.
|
|
nsISerialEventTarget* GetEventTarget() {
|
|
return base::Thread::message_loop()->SerialEventTarget();
|
|
}
|
|
|
|
protected:
|
|
IOThread(const char* aName);
|
|
~IOThread();
|
|
|
|
// Called by subclasses in the constructor/destructor to start/join the target
|
|
// thread. This cannot be done in the base class constructor/destructor, as
|
|
// the virtual Init()/CleanUp() methods need to be available.
|
|
void StartThread();
|
|
void StopThread();
|
|
|
|
// Init() and Cleanup() methods which will be invoked on the IOThread when the
|
|
// IOThread is started/stopped.
|
|
void Init() override = 0;
|
|
void CleanUp() override = 0;
|
|
|
|
private:
|
|
static IOThread* sSingleton;
|
|
};
|
|
|
|
// Background I/O thread used by the parent process.
|
|
class IOThreadParent : public IOThread {
|
|
public:
|
|
IOThreadParent();
|
|
~IOThreadParent();
|
|
|
|
protected:
|
|
void Init() override;
|
|
void CleanUp() override;
|
|
};
|
|
|
|
// Background I/O thread used by the child process.
|
|
class IOThreadChild : public IOThread {
|
|
public:
|
|
IOThreadChild(IPC::Channel::ChannelHandle aClientHandle,
|
|
base::ProcessId aParentPid);
|
|
~IOThreadChild();
|
|
|
|
mozilla::ipc::ScopedPort TakeInitialPort() { return std::move(mInitialPort); }
|
|
|
|
protected:
|
|
void Init() override;
|
|
void CleanUp() override;
|
|
|
|
private:
|
|
mozilla::ipc::ScopedPort mInitialPort;
|
|
IPC::Channel::ChannelHandle mClientHandle;
|
|
base::ProcessId mParentPid;
|
|
};
|
|
|
|
inline void AssertIOThread() {
|
|
MOZ_ASSERT(MessageLoop::TYPE_IO == MessageLoop::current()->type(),
|
|
"should be on the IO thread!");
|
|
}
|
|
|
|
} // namespace mozilla::ipc
|
|
|
|
#endif // mozilla_ipc_IOThreadParent_h
|