initexecutor.cpp raw

   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  }
  72