Merge bitcoin/bitcoin#22219: multiprocess: Start using init makeNode, makeChain, etc methods
e4709c7b56Start using init makeNode, makeChain, etc methods (Russell Yanofsky) Pull request description: Use `interfaces::Init::make*` methods instead of `interfaces::Make*` functions, so interfaces can be constructed differently in different executable without having to change any code. (So for example `bitcoin-gui` can make an `interfaces::Node` pointer that communicates with a `bitcoin-node` subprocess, while `bitcoin-qt` can make an `interfaces::Node` pointer that controls node code in the same process.) --- 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: jamesob: reACK https://github.com/bitcoin/bitcoin/commit/e4709c7b56612553fb7cbf16ef2d5099c5b732d0 achow101: ACKe4709c7b56benthecarman: utACKe4709c7b56Tree-SHA512: 580c1979dbb2ef444157c8e53041e70d15ddeee77e5cbdb34f70b6d228cc2d2fe3843825f172da84e506200c58f7e0932f7cd4c006bb5058c1f4e43259394834
This commit is contained in:
17 files changed
+63
-22
No files matched your search
+9
-7
@@ -11,6 +11,7 @@
|
||||
#include <chainparams.h>
|
||||
#include <init.h>
|
||||
#include <interfaces/handler.h>
|
||||
#include <interfaces/init.h>
|
||||
#include <interfaces/node.h>
|
||||
#include <node/context.h>
|
||||
#include <node/ui_interface.h>
|
||||
@@ -275,10 +276,10 @@ void BitcoinApplication::createSplashScreen(const NetworkStyle *networkStyle)
|
||||
connect(this, &BitcoinApplication::requestedShutdown, m_splash, &QWidget::close);
|
||||
}
|
||||
|
||||
void BitcoinApplication::setNode(interfaces::Node& node)
|
||||
void BitcoinApplication::createNode(interfaces::Init& init)
|
||||
{
|
||||
assert(!m_node);
|
||||
m_node = &node;
|
||||
m_node = init.makeNode();
|
||||
if (optionsModel) optionsModel->setNode(*m_node);
|
||||
if (m_splash) m_splash->setNode(*m_node);
|
||||
}
|
||||
@@ -460,11 +461,13 @@ int GuiMain(int argc, char* argv[])
|
||||
util::WinCmdLineArgs winArgs;
|
||||
std::tie(argc, argv) = winArgs.get();
|
||||
#endif
|
||||
SetupEnvironment();
|
||||
util::ThreadSetInternalName("main");
|
||||
|
||||
NodeContext node_context;
|
||||
std::unique_ptr<interfaces::Node> node = interfaces::MakeNode(&node_context);
|
||||
int unused_exit_status;
|
||||
std::unique_ptr<interfaces::Init> init = interfaces::MakeNodeInit(node_context, argc, argv, unused_exit_status);
|
||||
|
||||
SetupEnvironment();
|
||||
util::ThreadSetInternalName("main");
|
||||
|
||||
// Subscribe to global signals from core
|
||||
boost::signals2::scoped_connection handler_message_box = ::uiInterface.ThreadSafeMessageBox_connect(noui_ThreadSafeMessageBox);
|
||||
@@ -492,7 +495,6 @@ int GuiMain(int argc, char* argv[])
|
||||
|
||||
/// 2. Parse command-line options. We do this after qt in order to show an error if there are problems parsing these
|
||||
// Command-line options take precedence:
|
||||
node_context.args = &gArgs;
|
||||
SetupServerArgs(gArgs);
|
||||
SetupUIArgs(gArgs);
|
||||
std::string error;
|
||||
@@ -623,7 +625,7 @@ int GuiMain(int argc, char* argv[])
|
||||
if (gArgs.GetBoolArg("-splash", DEFAULT_SPLASHSCREEN) && !gArgs.GetBoolArg("-min", false))
|
||||
app.createSplashScreen(networkStyle.data());
|
||||
|
||||
app.setNode(*node);
|
||||
app.createNode(*init);
|
||||
|
||||
int rv = EXIT_SUCCESS;
|
||||
try
|
||||
|
||||
+6
-2
@@ -27,6 +27,9 @@ class PlatformStyle;
|
||||
class SplashScreen;
|
||||
class WalletController;
|
||||
class WalletModel;
|
||||
namespace interfaces {
|
||||
class Init;
|
||||
} // namespace interfaces
|
||||
|
||||
|
||||
/** Main Bitcoin application object */
|
||||
@@ -51,6 +54,8 @@ public:
|
||||
void createWindow(const NetworkStyle *networkStyle);
|
||||
/// Create splash screen
|
||||
void createSplashScreen(const NetworkStyle *networkStyle);
|
||||
/// Create or spawn node
|
||||
void createNode(interfaces::Init& init);
|
||||
/// Basic initialization, before starting initialization/shutdown thread. Return true on success.
|
||||
bool baseInitialize();
|
||||
|
||||
@@ -69,7 +74,6 @@ public:
|
||||
void setupPlatformStyle();
|
||||
|
||||
interfaces::Node& node() const { assert(m_node); return *m_node; }
|
||||
void setNode(interfaces::Node& node);
|
||||
|
||||
public Q_SLOTS:
|
||||
void initializeResult(bool success, interfaces::BlockAndHeaderTipInfo tip_info);
|
||||
@@ -103,7 +107,7 @@ private:
|
||||
const PlatformStyle *platformStyle;
|
||||
std::unique_ptr<QWidget> shutdownWindow;
|
||||
SplashScreen* m_splash = nullptr;
|
||||
interfaces::Node* m_node = nullptr;
|
||||
std::unique_ptr<interfaces::Node> m_node;
|
||||
|
||||
void startThread();
|
||||
};
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include <config/bitcoin-config.h>
|
||||
#endif
|
||||
|
||||
#include <interfaces/init.h>
|
||||
#include <interfaces/node.h>
|
||||
#include <qt/bitcoin.h>
|
||||
#include <qt/initexecutor.h>
|
||||
@@ -53,7 +54,8 @@ int main(int argc, char* argv[])
|
||||
}
|
||||
|
||||
NodeContext node_context;
|
||||
std::unique_ptr<interfaces::Node> node = interfaces::MakeNode(&node_context);
|
||||
int unused_exit_status;
|
||||
std::unique_ptr<interfaces::Init> init = interfaces::MakeNodeInit(node_context, argc, argv, unused_exit_status);
|
||||
gArgs.ForceSetArg("-listen", "0");
|
||||
gArgs.ForceSetArg("-listenonion", "0");
|
||||
gArgs.ForceSetArg("-discover", "0");
|
||||
@@ -76,10 +78,9 @@ int main(int argc, char* argv[])
|
||||
// Don't remove this, it's needed to access
|
||||
// QApplication:: and QCoreApplication:: in the tests
|
||||
BitcoinApplication app;
|
||||
app.setNode(*node);
|
||||
app.setApplicationName("Bitcoin-Qt-test");
|
||||
app.createNode(*init);
|
||||
|
||||
app.node().context()->args = &gArgs; // Make gArgs available in the NodeContext
|
||||
AppTests app_tests(app);
|
||||
if (QTest::qExec(&app_tests) != 0) {
|
||||
fInvalid = true;
|
||||
|
||||
@@ -138,6 +138,8 @@ void TestGUI(interfaces::Node& node)
|
||||
for (int i = 0; i < 5; ++i) {
|
||||
test.CreateAndProcessBlock({}, GetScriptForRawPubKey(test.coinbaseKey.GetPubKey()));
|
||||
}
|
||||
auto wallet_client = interfaces::MakeWalletClient(*test.m_node.chain, *Assert(test.m_node.args));
|
||||
test.m_node.wallet_client = wallet_client.get();
|
||||
node.setContext(&test.m_node);
|
||||
std::shared_ptr<CWallet> wallet = std::make_shared<CWallet>(node.context()->chain.get(), "", CreateMockWalletDatabase());
|
||||
wallet->LoadWallet();
|
||||
|
||||
Reference in new issue
Block a user