mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-04-25 22:39:13 +02:00
util: Add SignalInterrupt class and use in shutdown.cpp
This change helps generalize shutdown code so an interrupt can be provided to libbitcoinkernel callers. This may also be useful to eventually de-globalize all of the shutdown code. Co-authored-by: Russell Yanofsky <russ@yanofsky.org> Co-authored-by: TheCharlatan <seb.kung@gmail.com>
This commit is contained in:
@@ -14,9 +14,12 @@
|
||||
|
||||
|
||||
namespace kernel {
|
||||
Context* g_context;
|
||||
|
||||
Context::Context()
|
||||
{
|
||||
assert(!g_context);
|
||||
g_context = this;
|
||||
std::string sha256_algo = SHA256AutoDetect();
|
||||
LogPrintf("Using the '%s' SHA256 implementation\n", sha256_algo);
|
||||
RandomInit();
|
||||
@@ -26,6 +29,8 @@ Context::Context()
|
||||
Context::~Context()
|
||||
{
|
||||
ECC_Stop();
|
||||
assert(g_context);
|
||||
g_context = nullptr;
|
||||
}
|
||||
|
||||
} // namespace kernel
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
#ifndef BITCOIN_KERNEL_CONTEXT_H
|
||||
#define BITCOIN_KERNEL_CONTEXT_H
|
||||
|
||||
#include <util/signalinterrupt.h>
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace kernel {
|
||||
@@ -16,12 +18,24 @@ namespace kernel {
|
||||
//! State stored directly in this struct should be simple. More complex state
|
||||
//! should be stored to std::unique_ptr members pointing to opaque types.
|
||||
struct Context {
|
||||
//! Interrupt object that can be used to stop long-running kernel operations.
|
||||
util::SignalInterrupt interrupt;
|
||||
|
||||
//! Declare default constructor and destructor that are not inline, so code
|
||||
//! instantiating the kernel::Context struct doesn't need to #include class
|
||||
//! definitions for all the unique_ptr members.
|
||||
Context();
|
||||
~Context();
|
||||
};
|
||||
|
||||
//! Global pointer to kernel::Context for legacy code. New code should avoid
|
||||
//! using this, and require state it needs to be passed to it directly.
|
||||
//!
|
||||
//! Having this pointer is useful because it allows state be moved out of global
|
||||
//! variables into the kernel::Context struct before all global references to
|
||||
//! that state are removed. This allows the global references to be removed
|
||||
//! incrementally, instead of all at once.
|
||||
extern Context* g_context;
|
||||
} // namespace kernel
|
||||
|
||||
#endif // BITCOIN_KERNEL_CONTEXT_H
|
||||
|
||||
Reference in New Issue
Block a user