Bitcoin Core  27.99.0
P2P Digital Currency
initexecutor.cpp
Go to the documentation of this file.
1 // Copyright (c) 2014-2022 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #include <qt/initexecutor.h>
6 
7 #include <interfaces/node.h>
8 #include <util/exception.h>
9 #include <util/threadnames.h>
10 
11 #include <exception>
12 
13 #include <QDebug>
14 #include <QMetaObject>
15 #include <QObject>
16 #include <QString>
17 #include <QThread>
18 
20  : QObject(), m_node(node)
21 {
22  m_context.moveToThread(&m_thread);
23  m_thread.start();
24 }
25 
27 {
28  qDebug() << __func__ << ": Stopping thread";
29  m_thread.quit();
30  m_thread.wait();
31  qDebug() << __func__ << ": Stopped thread";
32 }
33 
34 void InitExecutor::handleRunawayException(const std::exception* e)
35 {
36  PrintExceptionContinue(e, "Runaway exception");
37  Q_EMIT runawayException(QString::fromStdString(m_node.getWarnings().translated));
38 }
39 
41 {
42  QMetaObject::invokeMethod(&m_context, [this] {
43  try {
44  util::ThreadRename("qt-init");
45  qDebug() << "Running initialization in thread";
47  bool rv = m_node.appInitMain(&tip_info);
48  Q_EMIT initializeResult(rv, tip_info);
49  } catch (const std::exception& e) {
51  } catch (...) {
52  handleRunawayException(nullptr);
53  }
54  });
55 }
56 
58 {
59  QMetaObject::invokeMethod(&m_context, [this] {
60  try {
61  qDebug() << "Running Shutdown in thread";
63  qDebug() << "Shutdown finished";
64  Q_EMIT shutdownResult();
65  } catch (const std::exception& e) {
67  } catch (...) {
68  handleRunawayException(nullptr);
69  }
70  });
71 }
node::NodeContext m_node
Definition: bitcoin-gui.cpp:37
void initialize()
void handleRunawayException(const std::exception *e)
Pass fatal exception message to UI thread.
void initializeResult(bool success, interfaces::BlockAndHeaderTipInfo tip_info)
QObject m_context
Definition: initexecutor.h:43
void runawayException(const QString &message)
void shutdownResult()
InitExecutor(interfaces::Node &node)
interfaces::Node & m_node
Definition: initexecutor.h:42
QThread m_thread
Definition: initexecutor.h:44
Top-level interface for a bitcoin node (bitcoind process).
Definition: node.h:70
virtual bilingual_str getWarnings()=0
Get warnings.
virtual void appShutdown()=0
Stop node.
virtual bool appInitMain(interfaces::BlockAndHeaderTipInfo *tip_info=nullptr)=0
Start node.
void PrintExceptionContinue(const std::exception *pex, std::string_view thread_name)
Definition: exception.cpp:36
Definition: init.h:25
void ThreadRename(std::string &&)
Rename a thread both in terms of an internal (in-memory) name as well as its system thread name.
Definition: threadnames.cpp:59
std::string translated
Definition: translation.h:20
Block and header tip information.
Definition: node.h:50