init: Initialize globals with kernel::Context's life
...instead of explicitly calling init::{Set,Unset}Globals.
Cool thing about this is that in both the testing and bitcoin-chainstate
codepaths, we no longer need to explicitly unset globals. The
kernel::Context goes out of scope and the globals are unset
"automatically".
Also construct kernel::Context outside of AppInitSanityChecks()
This commit is contained in:
1 parent
7d03feef81
commit
fed085a1a4
13 files changed
+69
-35
No files matched your search
+2
-1
@@ -357,6 +357,7 @@ libbitcoin_node_a_SOURCES = \
|
|||||||
index/txindex.cpp \
|
index/txindex.cpp \
|
||||||
init.cpp \
|
init.cpp \
|
||||||
kernel/coinstats.cpp \
|
kernel/coinstats.cpp \
|
||||||
|
kernel/context.cpp \
|
||||||
mapport.cpp \
|
mapport.cpp \
|
||||||
net.cpp \
|
net.cpp \
|
||||||
netgroup.cpp \
|
netgroup.cpp \
|
||||||
@@ -865,8 +866,8 @@ libbitcoinkernel_la_SOURCES = \
|
|||||||
flatfile.cpp \
|
flatfile.cpp \
|
||||||
fs.cpp \
|
fs.cpp \
|
||||||
hash.cpp \
|
hash.cpp \
|
||||||
init/common.cpp \
|
|
||||||
kernel/coinstats.cpp \
|
kernel/coinstats.cpp \
|
||||||
|
kernel/context.cpp \
|
||||||
key.cpp \
|
key.cpp \
|
||||||
logging.cpp \
|
logging.cpp \
|
||||||
node/blockstorage.cpp \
|
node/blockstorage.cpp \
|
||||||
|
|||||||
@@ -11,6 +11,8 @@
|
|||||||
//
|
//
|
||||||
// It is part of the libbitcoinkernel project.
|
// It is part of the libbitcoinkernel project.
|
||||||
|
|
||||||
|
#include <kernel/context.h>
|
||||||
|
|
||||||
#include <chainparams.h>
|
#include <chainparams.h>
|
||||||
#include <consensus/validation.h>
|
#include <consensus/validation.h>
|
||||||
#include <core_io.h>
|
#include <core_io.h>
|
||||||
@@ -49,7 +51,7 @@ int main(int argc, char* argv[])
|
|||||||
SelectParams(CBaseChainParams::MAIN);
|
SelectParams(CBaseChainParams::MAIN);
|
||||||
const CChainParams& chainparams = Params();
|
const CChainParams& chainparams = Params();
|
||||||
|
|
||||||
init::SetGlobals(); // ECC_Start, etc.
|
kernel::Context kernel_context{};
|
||||||
|
|
||||||
// Necessary for CheckInputScripts (eventually called by ProcessNewBlock),
|
// Necessary for CheckInputScripts (eventually called by ProcessNewBlock),
|
||||||
// which will try the script cache first and fall back to actually
|
// which will try the script cache first and fall back to actually
|
||||||
@@ -254,6 +256,4 @@ epilogue:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
GetMainSignals().UnregisterBackgroundSignalScheduler();
|
GetMainSignals().UnregisterBackgroundSignalScheduler();
|
||||||
|
|
||||||
init::UnsetGlobals();
|
|
||||||
}
|
}
|
||||||
@@ -188,11 +188,14 @@ static bool AppInit(NodeContext& node, int argc, char* argv[])
|
|||||||
// InitError will have been called with detailed error, which ends up on console
|
// InitError will have been called with detailed error, which ends up on console
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
node.kernel = std::make_unique<kernel::Context>();
|
||||||
if (!AppInitSanityChecks())
|
if (!AppInitSanityChecks())
|
||||||
{
|
{
|
||||||
// InitError will have been called with detailed error, which ends up on console
|
// InitError will have been called with detailed error, which ends up on console
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args.GetBoolArg("-daemon", DEFAULT_DAEMON) || args.GetBoolArg("-daemonwait", DEFAULT_DAEMONWAIT)) {
|
if (args.GetBoolArg("-daemon", DEFAULT_DAEMON) || args.GetBoolArg("-daemonwait", DEFAULT_DAEMONWAIT)) {
|
||||||
#if HAVE_DECL_FORK
|
#if HAVE_DECL_FORK
|
||||||
tfm::format(std::cout, PACKAGE_NAME " starting\n");
|
tfm::format(std::cout, PACKAGE_NAME " starting\n");
|
||||||
|
|||||||
+1
-4
@@ -304,7 +304,7 @@ void Shutdown(NodeContext& node)
|
|||||||
node.chain_clients.clear();
|
node.chain_clients.clear();
|
||||||
UnregisterAllValidationInterfaces();
|
UnregisterAllValidationInterfaces();
|
||||||
GetMainSignals().UnregisterBackgroundSignalScheduler();
|
GetMainSignals().UnregisterBackgroundSignalScheduler();
|
||||||
init::UnsetGlobals();
|
node.kernel.reset();
|
||||||
node.mempool.reset();
|
node.mempool.reset();
|
||||||
node.fee_estimator.reset();
|
node.fee_estimator.reset();
|
||||||
node.chainman.reset();
|
node.chainman.reset();
|
||||||
@@ -1092,9 +1092,6 @@ static bool LockDataDirectory(bool probeOnly)
|
|||||||
bool AppInitSanityChecks()
|
bool AppInitSanityChecks()
|
||||||
{
|
{
|
||||||
// ********************************************************* Step 4: sanity checks
|
// ********************************************************* Step 4: sanity checks
|
||||||
|
|
||||||
init::SetGlobals();
|
|
||||||
|
|
||||||
if (!init::SanityChecks()) {
|
if (!init::SanityChecks()) {
|
||||||
return InitError(strprintf(_("Initialization sanity check failed. %s is shutting down."), PACKAGE_NAME));
|
return InitError(strprintf(_("Initialization sanity check failed. %s is shutting down."), PACKAGE_NAME));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,9 @@ class ArgsManager;
|
|||||||
namespace interfaces {
|
namespace interfaces {
|
||||||
struct BlockAndHeaderTipInfo;
|
struct BlockAndHeaderTipInfo;
|
||||||
}
|
}
|
||||||
|
namespace kernel {
|
||||||
|
struct Context;
|
||||||
|
}
|
||||||
namespace node {
|
namespace node {
|
||||||
struct NodeContext;
|
struct NodeContext;
|
||||||
} // namespace node
|
} // namespace node
|
||||||
|
|||||||
@@ -7,12 +7,10 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <clientversion.h>
|
#include <clientversion.h>
|
||||||
#include <crypto/sha256.h>
|
|
||||||
#include <fs.h>
|
#include <fs.h>
|
||||||
#include <key.h>
|
#include <key.h>
|
||||||
#include <logging.h>
|
#include <logging.h>
|
||||||
#include <node/ui_interface.h>
|
#include <node/ui_interface.h>
|
||||||
#include <pubkey.h>
|
|
||||||
#include <random.h>
|
#include <random.h>
|
||||||
#include <tinyformat.h>
|
#include <tinyformat.h>
|
||||||
#include <util/system.h>
|
#include <util/system.h>
|
||||||
@@ -20,28 +18,10 @@
|
|||||||
#include <util/translation.h>
|
#include <util/translation.h>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <memory>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
static std::unique_ptr<ECCVerifyHandle> globalVerifyHandle;
|
|
||||||
|
|
||||||
namespace init {
|
namespace init {
|
||||||
void SetGlobals()
|
|
||||||
{
|
|
||||||
std::string sha256_algo = SHA256AutoDetect();
|
|
||||||
LogPrintf("Using the '%s' SHA256 implementation\n", sha256_algo);
|
|
||||||
RandomInit();
|
|
||||||
ECC_Start();
|
|
||||||
globalVerifyHandle.reset(new ECCVerifyHandle());
|
|
||||||
}
|
|
||||||
|
|
||||||
void UnsetGlobals()
|
|
||||||
{
|
|
||||||
globalVerifyHandle.reset();
|
|
||||||
ECC_Stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SanityChecks()
|
bool SanityChecks()
|
||||||
{
|
{
|
||||||
if (!ECC_InitSanityCheck()) {
|
if (!ECC_InitSanityCheck()) {
|
||||||
|
|||||||
@@ -11,8 +11,6 @@
|
|||||||
class ArgsManager;
|
class ArgsManager;
|
||||||
|
|
||||||
namespace init {
|
namespace init {
|
||||||
void SetGlobals();
|
|
||||||
void UnsetGlobals();
|
|
||||||
/**
|
/**
|
||||||
* Ensure a usable environment with all
|
* Ensure a usable environment with all
|
||||||
* necessary library support.
|
* necessary library support.
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
// Copyright (c) 2022 The Bitcoin Core developers
|
||||||
|
// Distributed under the MIT software license, see the accompanying
|
||||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
#include <kernel/context.h>
|
||||||
|
|
||||||
|
#include <crypto/sha256.h>
|
||||||
|
#include <key.h>
|
||||||
|
#include <logging.h>
|
||||||
|
#include <pubkey.h>
|
||||||
|
#include <random.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
|
||||||
|
namespace kernel {
|
||||||
|
|
||||||
|
Context::Context()
|
||||||
|
{
|
||||||
|
std::string sha256_algo = SHA256AutoDetect();
|
||||||
|
LogPrintf("Using the '%s' SHA256 implementation\n", sha256_algo);
|
||||||
|
RandomInit();
|
||||||
|
ECC_Start();
|
||||||
|
ecc_verify_handle.reset(new ECCVerifyHandle());
|
||||||
|
}
|
||||||
|
|
||||||
|
Context::~Context()
|
||||||
|
{
|
||||||
|
ecc_verify_handle.reset();
|
||||||
|
ECC_Stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace kernel
|
||||||
@@ -5,6 +5,10 @@
|
|||||||
#ifndef BITCOIN_KERNEL_CONTEXT_H
|
#ifndef BITCOIN_KERNEL_CONTEXT_H
|
||||||
#define BITCOIN_KERNEL_CONTEXT_H
|
#define BITCOIN_KERNEL_CONTEXT_H
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
class ECCVerifyHandle;
|
||||||
|
|
||||||
namespace kernel {
|
namespace kernel {
|
||||||
//! Context struct holding the kernel library's logically global state, and
|
//! Context struct holding the kernel library's logically global state, and
|
||||||
//! passed to external libbitcoin_kernel functions which need access to this
|
//! passed to external libbitcoin_kernel functions which need access to this
|
||||||
@@ -14,6 +18,13 @@ namespace kernel {
|
|||||||
//! State stored directly in this struct should be simple. More complex state
|
//! State stored directly in this struct should be simple. More complex state
|
||||||
//! should be stored to std::unique_ptr members pointing to opaque types.
|
//! should be stored to std::unique_ptr members pointing to opaque types.
|
||||||
struct Context {
|
struct Context {
|
||||||
|
std::unique_ptr<ECCVerifyHandle> ecc_verify_handle;
|
||||||
|
|
||||||
|
//! 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();
|
||||||
};
|
};
|
||||||
} // namespace kernel
|
} // namespace kernel
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
#include <addrman.h>
|
#include <addrman.h>
|
||||||
#include <banman.h>
|
#include <banman.h>
|
||||||
#include <interfaces/chain.h>
|
#include <interfaces/chain.h>
|
||||||
|
#include <kernel/context.h>
|
||||||
#include <net.h>
|
#include <net.h>
|
||||||
#include <net_processing.h>
|
#include <net_processing.h>
|
||||||
#include <netgroup.h>
|
#include <netgroup.h>
|
||||||
|
|||||||
+10
-2
@@ -90,8 +90,16 @@ public:
|
|||||||
uint32_t getLogCategories() override { return LogInstance().GetCategoryMask(); }
|
uint32_t getLogCategories() override { return LogInstance().GetCategoryMask(); }
|
||||||
bool baseInitialize() override
|
bool baseInitialize() override
|
||||||
{
|
{
|
||||||
return AppInitBasicSetup(gArgs) && AppInitParameterInteraction(gArgs, /*use_syscall_sandbox=*/false) && AppInitSanityChecks() &&
|
if (!AppInitBasicSetup(gArgs)) return false;
|
||||||
AppInitLockDataDirectory() && AppInitInterfaces(*m_context);
|
if (!AppInitParameterInteraction(gArgs, /*use_syscall_sandbox=*/false)) return false;
|
||||||
|
|
||||||
|
m_context->kernel = std::make_unique<kernel::Context>();
|
||||||
|
if (!AppInitSanityChecks()) return false;
|
||||||
|
|
||||||
|
if (!AppInitLockDataDirectory()) return false;
|
||||||
|
if (!AppInitInterfaces(*m_context)) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
bool appInitMain(interfaces::BlockAndHeaderTipInfo* tip_info) override
|
bool appInitMain(interfaces::BlockAndHeaderTipInfo* tip_info) override
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ BasicTestingSetup::BasicTestingSetup(const std::string& chainName, const std::ve
|
|||||||
InitLogging(*m_node.args);
|
InitLogging(*m_node.args);
|
||||||
AppInitParameterInteraction(*m_node.args);
|
AppInitParameterInteraction(*m_node.args);
|
||||||
LogInstance().StartLogging();
|
LogInstance().StartLogging();
|
||||||
init::SetGlobals();
|
m_node.kernel = std::make_unique<kernel::Context>();
|
||||||
SetupEnvironment();
|
SetupEnvironment();
|
||||||
SetupNetworking();
|
SetupNetworking();
|
||||||
InitSignatureCache();
|
InitSignatureCache();
|
||||||
@@ -146,7 +146,6 @@ BasicTestingSetup::~BasicTestingSetup()
|
|||||||
LogInstance().DisconnectTestLogger();
|
LogInstance().DisconnectTestLogger();
|
||||||
fs::remove_all(m_path_root);
|
fs::remove_all(m_path_root);
|
||||||
gArgs.ClearArgs();
|
gArgs.ClearArgs();
|
||||||
init::UnsetGlobals();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ChainTestingSetup::ChainTestingSetup(const std::string& chainName, const std::vector<const char*>& extra_args)
|
ChainTestingSetup::ChainTestingSetup(const std::string& chainName, const std::vector<const char*>& extra_args)
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ static constexpr CAmount CENT{1000000};
|
|||||||
* This just configures logging, data dir and chain parameters.
|
* This just configures logging, data dir and chain parameters.
|
||||||
*/
|
*/
|
||||||
struct BasicTestingSetup {
|
struct BasicTestingSetup {
|
||||||
node::NodeContext m_node;
|
node::NodeContext m_node; // keep as first member to be destructed last
|
||||||
|
|
||||||
explicit BasicTestingSetup(const std::string& chainName = CBaseChainParams::MAIN, const std::vector<const char*>& extra_args = {});
|
explicit BasicTestingSetup(const std::string& chainName = CBaseChainParams::MAIN, const std::vector<const char*>& extra_args = {});
|
||||||
~BasicTestingSetup();
|
~BasicTestingSetup();
|
||||||
|
|||||||
Reference in new issue
Block a user