initexecutor.cpp
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 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 }