/ src / qt / initexecutor.cpp
initexecutor.cpp
 1  // Copyright (c) 2014-present 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  
19  InitExecutor::InitExecutor(interfaces::Node& node)
20      : QObject(), m_node(node)
21  {
22      m_context.moveToThread(&m_thread);
23      m_thread.start();
24  }
25  
26  InitExecutor::~InitExecutor()
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  
40  void InitExecutor::initialize()
41  {
42      QMetaObject::invokeMethod(&m_context, [this] {
43          try {
44              util::ThreadRename("qt-init");
45              qDebug() << "Running initialization in thread";
46              interfaces::BlockAndHeaderTipInfo tip_info;
47              bool rv = m_node.appInitMain(&tip_info);
48              Q_EMIT initializeResult(rv, tip_info);
49          } catch (const std::exception& e) {
50              handleRunawayException(&e);
51          } catch (...) {
52              handleRunawayException(nullptr);
53          }
54      });
55  }
56  
57  void InitExecutor::shutdown()
58  {
59      QMetaObject::invokeMethod(&m_context, [this] {
60          try {
61              qDebug() << "Running Shutdown in thread";
62              m_node.appShutdown();
63              qDebug() << "Shutdown finished";
64              Q_EMIT shutdownResult();
65          } catch (const std::exception& e) {
66              handleRunawayException(&e);
67          } catch (...) {
68              handleRunawayException(nullptr);
69          }
70      });
71  }