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:
Carl Dong committed 2022-06-02 11:40:03 -04:00
1 parent 7d03feef81
commit fed085a1a4
13 files changed
+69 -35

No files matched your search

+2 -1
View File
@@ -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 \
+3 -3
View File
@@ -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();
} }
+3
View File
@@ -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
View File
@@ -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));
} }
+3
View File
@@ -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
-20
View File
@@ -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()) {
-2
View File
@@ -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.
+33
View File
@@ -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
+11
View File
@@ -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
+1
View File
@@ -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
View File
@@ -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
{ {
+1 -2
View File
@@ -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)
+1 -1
View File
@@ -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();