From f485e0fa1fc4c182f8e75ad97bf5cdc8deff0ba2 Mon Sep 17 00:00:00 2001 From: Aditya Kulkarni Date: Wed, 7 Nov 2018 21:11:53 -0800 Subject: [PATCH] Proper shutdown procedure --- src/connection.cpp | 16 ++++++++++++++++ src/connection.h | 5 +++++ src/rpc.cpp | 9 ++++++--- src/rpc.h | 1 + 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/connection.cpp b/src/connection.cpp index 7b4be73..42ff779 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -487,10 +487,19 @@ Connection::~Connection() { void Connection::doRPC(const json& payload, const std::function& cb, const std::function& ne) { + if (shutdownInProgress) { + qDebug() << "Ignoring RPC because shutdown in progress"; + return; + } + QNetworkReply *reply = restclient->post(*request, QByteArray::fromStdString(payload.dump())); QObject::connect(reply, &QNetworkReply::finished, [=] { reply->deleteLater(); + if (shutdownInProgress) { + qDebug() << "Ignoring callback because shutdown in progress"; + return; + } if (reply->error() != QNetworkReply::NoError) { auto parsed = json::parse(reply->readAll(), nullptr, false); @@ -530,3 +539,10 @@ void Connection::showTxError(const QString& error) { QMessageBox::critical(main, "Transaction Error", "There was an error sending the transaction. The error was: \n\n" + error, QMessageBox::StandardButton::Ok); } + +/** + * Prevent all future calls from going through + */ +void Connection::shutdown() { + shutdownInProgress = true; +} \ No newline at end of file diff --git a/src/connection.h b/src/connection.h index fc3c3c0..95e157f 100644 --- a/src/connection.h +++ b/src/connection.h @@ -90,6 +90,8 @@ public: std::shared_ptr config; MainWindow* main; + void shutdown(); + void doRPC(const json& payload, const std::function& cb, const std::function& ne); void doRPCWithDefaultErrorHandling(const json& payload, const std::function& cb); @@ -143,6 +145,9 @@ public: }); waitTimer->start(100); } + +private: + bool shutdownInProgress = false; }; #endif diff --git a/src/rpc.cpp b/src/rpc.cpp index da02c53..db5da25 100644 --- a/src/rpc.cpp +++ b/src/rpc.cpp @@ -857,6 +857,8 @@ void RPC::shutdownZcashd() { }; conn->doRPCWithDefaultErrorHandling(payload, [=](auto) {}); + conn->shutdown(); + QMessageBox d(main); d.setIcon(QMessageBox::Icon::Information); @@ -869,11 +871,12 @@ void RPC::shutdownZcashd() { // We capture by reference all the local variables because of the d.exec() // below, which blocks this function until we exit. QObject::connect(&waiter, &QTimer::timeout, [&] () { - if (ezcashd->atEnd()) { + if (ezcashd->atEnd() && ezcashd->processId() == 0) { qDebug() << "Ended"; - d.accept(); + waiter.stop(); + QTimer::singleShot(1000, [&]() { d.accept(); }); } else { - qDebug() << "Not ended"; + qDebug() << "Not ended, continuing to wait..."; } }); waiter.start(1000); diff --git a/src/rpc.h b/src/rpc.h index c2539c3..6d2d8e9 100644 --- a/src/rpc.h +++ b/src/rpc.h @@ -112,6 +112,7 @@ private: // Current balance in the UI. If this number updates, then refresh the UI QString currentBalance; + // First time warning flag for no connection bool firstTime = true; };