mirror of
https://github.com/dashpay/dash.git
synced 2024-12-24 19:42:46 +01:00
Merge bitcoin/bitcoin#22218: multiprocess: Add ipc::Context and ipc::capnp::Context structs
3e33d170cc0a8f386791777f3cc597e2bd0bf2ee 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 ACK 3e33d170 Tree-SHA512: fd949fae5f1a973d39cb97f2745821ab2f62b98e166e53bc2801f97dcde988e18faaaaa0ffc2a82c170938b3a18078b6162fa35460e6e7c635e681b3c9e5b0a6
This commit is contained in:
parent
e41615572e
commit
9d9d97d4fd
@ -1018,9 +1018,11 @@ EXTRA_DIST += $(libbitcoin_ipc_mpgen_input)
|
||||
if BUILD_MULTIPROCESS
|
||||
LIBBITCOIN_IPC=libbitcoin_ipc.a
|
||||
libbitcoin_ipc_a_SOURCES = \
|
||||
ipc/capnp/context.h \
|
||||
ipc/capnp/init-types.h \
|
||||
ipc/capnp/protocol.cpp \
|
||||
ipc/capnp/protocol.h \
|
||||
ipc/context.h \
|
||||
ipc/exception.h \
|
||||
ipc/interfaces.cpp \
|
||||
ipc/process.cpp \
|
||||
|
@ -9,6 +9,10 @@
|
||||
#include <memory>
|
||||
#include <typeindex>
|
||||
|
||||
namespace ipc {
|
||||
struct Context;
|
||||
} // namespace ipc
|
||||
|
||||
namespace interfaces {
|
||||
class Init;
|
||||
|
||||
@ -58,6 +62,9 @@ public:
|
||||
addCleanup(typeid(Interface), &iface, std::move(cleanup));
|
||||
}
|
||||
|
||||
//! IPC context struct accessor (see struct definition for more description).
|
||||
virtual ipc::Context& context() = 0;
|
||||
|
||||
protected:
|
||||
//! Internal implementation of public addCleanup method (above) as a
|
||||
//! 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.
|
||||
|
||||
#include <interfaces/init.h>
|
||||
#include <ipc/capnp/context.h>
|
||||
#include <ipc/capnp/init.capnp.h>
|
||||
#include <ipc/capnp/init.capnp.proxy.h>
|
||||
#include <ipc/capnp/protocol.h>
|
||||
@ -54,7 +55,7 @@ public:
|
||||
{
|
||||
assert(!m_loop);
|
||||
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);
|
||||
m_loop->loop();
|
||||
m_loop.reset();
|
||||
@ -63,13 +64,14 @@ public:
|
||||
{
|
||||
mp::ProxyTypeRegister::types().at(type)(iface).cleanup.emplace_back(std::move(cleanup));
|
||||
}
|
||||
Context& context() override { return m_context; }
|
||||
void startLoop(const char* exe_name)
|
||||
{
|
||||
if (m_loop) return;
|
||||
std::promise<void> promise;
|
||||
m_loop_thread = std::thread([&] {
|
||||
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);
|
||||
m_loop->addClient(lock);
|
||||
@ -80,6 +82,7 @@ public:
|
||||
});
|
||||
promise.get_future().wait();
|
||||
}
|
||||
Context m_context;
|
||||
std::thread m_loop_thread;
|
||||
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));
|
||||
}
|
||||
Context& context() override { return m_protocol->context(); }
|
||||
const char* m_exe_name;
|
||||
const char* m_process_argv0;
|
||||
interfaces::Init& m_init;
|
||||
|
@ -12,6 +12,8 @@
|
||||
#include <typeindex>
|
||||
|
||||
namespace ipc {
|
||||
struct Context;
|
||||
|
||||
//! IPC protocol interface for calling IPC methods over sockets.
|
||||
//!
|
||||
//! 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
|
||||
//! deleted.
|
||||
virtual void addCleanup(std::type_index type, void* iface, std::function<void()> cleanup) = 0;
|
||||
|
||||
//! Context accessor.
|
||||
virtual Context& context() = 0;
|
||||
};
|
||||
} // namespace ipc
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user