Browse Source

Proper shutdown procedure

recurring
Aditya Kulkarni 6 years ago
parent
commit
f485e0fa1f
  1. 16
      src/connection.cpp
  2. 5
      src/connection.h
  3. 9
      src/rpc.cpp
  4. 1
      src/rpc.h

16
src/connection.cpp

@ -487,10 +487,19 @@ Connection::~Connection() {
void Connection::doRPC(const json& payload, const std::function<void(json)>& cb,
const std::function<void(QNetworkReply*, const json&)>& 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;
}

5
src/connection.h

@ -90,6 +90,8 @@ public:
std::shared_ptr<ConnectionConfig> config;
MainWindow* main;
void shutdown();
void doRPC(const json& payload, const std::function<void(json)>& cb,
const std::function<void(QNetworkReply*, const json&)>& ne);
void doRPCWithDefaultErrorHandling(const json& payload, const std::function<void(json)>& cb);
@ -143,6 +145,9 @@ public:
});
waitTimer->start(100);
}
private:
bool shutdownInProgress = false;
};
#endif

9
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);

1
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;
};

Loading…
Cancel
Save