mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-26 19:23:26 -03:00
Merge bitcoin/bitcoin#22218: multiprocess: Add ipc::Context and ipc::capnp::Context structs
3e33d170cc
Add ipc::Context and ipc::capnp::Context structs (Russell Yanofsky) Pull request description: These are currently empty structs but they will be used to pass some function and object pointers from bitcoin application code to IPC hooks that run, for example, when a remote object is created or destroyed, or a new process is created. --- This PR is part of the [process separation project](https://github.com/bitcoin/bitcoin/projects/10). The commit was first part of larger PR #10102. ACKs for top commit: ariard: Code Review ACK3e33d170
Tree-SHA512: fd949fae5f1a973d39cb97f2745821ab2f62b98e166e53bc2801f97dcde988e18faaaaa0ffc2a82c170938b3a18078b6162fa35460e6e7c635e681b3c9e5b0a6
This commit is contained in:
commit
ba15ab4990
7 changed files with 62 additions and 2 deletions
|
@ -842,9 +842,11 @@ EXTRA_DIST += $(libbitcoin_ipc_mpgen_input)
|
||||||
if BUILD_MULTIPROCESS
|
if BUILD_MULTIPROCESS
|
||||||
LIBBITCOIN_IPC=libbitcoin_ipc.a
|
LIBBITCOIN_IPC=libbitcoin_ipc.a
|
||||||
libbitcoin_ipc_a_SOURCES = \
|
libbitcoin_ipc_a_SOURCES = \
|
||||||
|
ipc/capnp/context.h \
|
||||||
ipc/capnp/init-types.h \
|
ipc/capnp/init-types.h \
|
||||||
ipc/capnp/protocol.cpp \
|
ipc/capnp/protocol.cpp \
|
||||||
ipc/capnp/protocol.h \
|
ipc/capnp/protocol.h \
|
||||||
|
ipc/context.h \
|
||||||
ipc/exception.h \
|
ipc/exception.h \
|
||||||
ipc/interfaces.cpp \
|
ipc/interfaces.cpp \
|
||||||
ipc/process.cpp \
|
ipc/process.cpp \
|
||||||
|
|
|
@ -9,6 +9,10 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <typeindex>
|
#include <typeindex>
|
||||||
|
|
||||||
|
namespace ipc {
|
||||||
|
struct Context;
|
||||||
|
} // namespace ipc
|
||||||
|
|
||||||
namespace interfaces {
|
namespace interfaces {
|
||||||
class Init;
|
class Init;
|
||||||
|
|
||||||
|
@ -58,6 +62,9 @@ public:
|
||||||
addCleanup(typeid(Interface), &iface, std::move(cleanup));
|
addCleanup(typeid(Interface), &iface, std::move(cleanup));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//! IPC context struct accessor (see struct definition for more description).
|
||||||
|
virtual ipc::Context& context() = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//! Internal implementation of public addCleanup method (above) as a
|
//! Internal implementation of public addCleanup method (above) as a
|
||||||
//! type-erased virtual function, since template functions can't be virtual.
|
//! type-erased virtual function, since template functions can't be virtual.
|
||||||
|
|
23
src/ipc/capnp/context.h
Normal file
23
src/ipc/capnp/context.h
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
// Copyright (c) 2021 The Bitcoin Core developers
|
||||||
|
// Distributed under the MIT software license, see the accompanying
|
||||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
#ifndef BITCOIN_IPC_CAPNP_CONTEXT_H
|
||||||
|
#define BITCOIN_IPC_CAPNP_CONTEXT_H
|
||||||
|
|
||||||
|
#include <ipc/context.h>
|
||||||
|
|
||||||
|
namespace ipc {
|
||||||
|
namespace capnp {
|
||||||
|
//! Cap'n Proto context struct. Generally the parent ipc::Context struct should
|
||||||
|
//! be used instead of this struct to give all IPC protocols access to
|
||||||
|
//! application state, so there aren't unnecessary differences between IPC
|
||||||
|
//! protocols. But this specialized struct can be used to pass capnp-specific
|
||||||
|
//! function and object types to capnp hooks.
|
||||||
|
struct Context : ipc::Context
|
||||||
|
{
|
||||||
|
};
|
||||||
|
} // namespace capnp
|
||||||
|
} // namespace ipc
|
||||||
|
|
||||||
|
#endif // BITCOIN_IPC_CAPNP_CONTEXT_H
|
|
@ -3,6 +3,7 @@
|
||||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
#include <interfaces/init.h>
|
#include <interfaces/init.h>
|
||||||
|
#include <ipc/capnp/context.h>
|
||||||
#include <ipc/capnp/init.capnp.h>
|
#include <ipc/capnp/init.capnp.h>
|
||||||
#include <ipc/capnp/init.capnp.proxy.h>
|
#include <ipc/capnp/init.capnp.proxy.h>
|
||||||
#include <ipc/capnp/protocol.h>
|
#include <ipc/capnp/protocol.h>
|
||||||
|
@ -54,7 +55,7 @@ public:
|
||||||
{
|
{
|
||||||
assert(!m_loop);
|
assert(!m_loop);
|
||||||
mp::g_thread_context.thread_name = mp::ThreadName(exe_name);
|
mp::g_thread_context.thread_name = mp::ThreadName(exe_name);
|
||||||
m_loop.emplace(exe_name, &IpcLogFn, nullptr);
|
m_loop.emplace(exe_name, &IpcLogFn, &m_context);
|
||||||
mp::ServeStream<messages::Init>(*m_loop, fd, init);
|
mp::ServeStream<messages::Init>(*m_loop, fd, init);
|
||||||
m_loop->loop();
|
m_loop->loop();
|
||||||
m_loop.reset();
|
m_loop.reset();
|
||||||
|
@ -63,13 +64,14 @@ public:
|
||||||
{
|
{
|
||||||
mp::ProxyTypeRegister::types().at(type)(iface).cleanup.emplace_back(std::move(cleanup));
|
mp::ProxyTypeRegister::types().at(type)(iface).cleanup.emplace_back(std::move(cleanup));
|
||||||
}
|
}
|
||||||
|
Context& context() override { return m_context; }
|
||||||
void startLoop(const char* exe_name)
|
void startLoop(const char* exe_name)
|
||||||
{
|
{
|
||||||
if (m_loop) return;
|
if (m_loop) return;
|
||||||
std::promise<void> promise;
|
std::promise<void> promise;
|
||||||
m_loop_thread = std::thread([&] {
|
m_loop_thread = std::thread([&] {
|
||||||
util::ThreadRename("capnp-loop");
|
util::ThreadRename("capnp-loop");
|
||||||
m_loop.emplace(exe_name, &IpcLogFn, nullptr);
|
m_loop.emplace(exe_name, &IpcLogFn, &m_context);
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> lock(m_loop->m_mutex);
|
std::unique_lock<std::mutex> lock(m_loop->m_mutex);
|
||||||
m_loop->addClient(lock);
|
m_loop->addClient(lock);
|
||||||
|
@ -80,6 +82,7 @@ public:
|
||||||
});
|
});
|
||||||
promise.get_future().wait();
|
promise.get_future().wait();
|
||||||
}
|
}
|
||||||
|
Context m_context;
|
||||||
std::thread m_loop_thread;
|
std::thread m_loop_thread;
|
||||||
std::optional<mp::EventLoop> m_loop;
|
std::optional<mp::EventLoop> m_loop;
|
||||||
};
|
};
|
||||||
|
|
19
src/ipc/context.h
Normal file
19
src/ipc/context.h
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright (c) 2021 The Bitcoin Core developers
|
||||||
|
// Distributed under the MIT software license, see the accompanying
|
||||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
#ifndef BITCOIN_IPC_CONTEXT_H
|
||||||
|
#define BITCOIN_IPC_CONTEXT_H
|
||||||
|
|
||||||
|
namespace ipc {
|
||||||
|
//! Context struct used to give IPC protocol implementations or implementation
|
||||||
|
//! hooks access to application state, in case they need to run extra code that
|
||||||
|
//! isn't needed within a single process, like code copying global state from an
|
||||||
|
//! existing process to a new process when it's initialized, or code dealing
|
||||||
|
//! with shared objects that are created or destroyed remotely.
|
||||||
|
struct Context
|
||||||
|
{
|
||||||
|
};
|
||||||
|
} // namespace ipc
|
||||||
|
|
||||||
|
#endif // BITCOIN_IPC_CONTEXT_H
|
|
@ -60,6 +60,7 @@ public:
|
||||||
{
|
{
|
||||||
m_protocol->addCleanup(type, iface, std::move(cleanup));
|
m_protocol->addCleanup(type, iface, std::move(cleanup));
|
||||||
}
|
}
|
||||||
|
Context& context() override { return m_protocol->context(); }
|
||||||
const char* m_exe_name;
|
const char* m_exe_name;
|
||||||
const char* m_process_argv0;
|
const char* m_process_argv0;
|
||||||
interfaces::Init& m_init;
|
interfaces::Init& m_init;
|
||||||
|
|
|
@ -12,6 +12,8 @@
|
||||||
#include <typeindex>
|
#include <typeindex>
|
||||||
|
|
||||||
namespace ipc {
|
namespace ipc {
|
||||||
|
struct Context;
|
||||||
|
|
||||||
//! IPC protocol interface for calling IPC methods over sockets.
|
//! IPC protocol interface for calling IPC methods over sockets.
|
||||||
//!
|
//!
|
||||||
//! There may be different implementations of this interface for different IPC
|
//! There may be different implementations of this interface for different IPC
|
||||||
|
@ -33,6 +35,9 @@ public:
|
||||||
//! Add cleanup callback to interface that will run when the interface is
|
//! Add cleanup callback to interface that will run when the interface is
|
||||||
//! deleted.
|
//! deleted.
|
||||||
virtual void addCleanup(std::type_index type, void* iface, std::function<void()> cleanup) = 0;
|
virtual void addCleanup(std::type_index type, void* iface, std::function<void()> cleanup) = 0;
|
||||||
|
|
||||||
|
//! Context accessor.
|
||||||
|
virtual Context& context() = 0;
|
||||||
};
|
};
|
||||||
} // namespace ipc
|
} // namespace ipc
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue