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