From a01ffc6e1ae24dfbabaa640d65208140fa281dbf Mon Sep 17 00:00:00 2001
From: xiphon <xiphon@protonmail.com>
Date: Tue, 13 Aug 2019 12:21:47 +0000
Subject: [PATCH] daemon: async daemon status check, don't freeze on wallet
 startup

---
 main.qml                     | 8 ++++++--
 src/daemon/DaemonManager.cpp | 8 ++++++++
 src/daemon/DaemonManager.h   | 5 +++--
 3 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/main.qml b/main.qml
index 76057fda..adce4d80 100644
--- a/main.qml
+++ b/main.qml
@@ -486,8 +486,12 @@ ApplicationWindow {
         middlePanel.transferView.updatePriorityDropdown();
 
         // If wallet isnt connected, advanced wallet mode and no daemon is running - Ask
-        if(!isMobile && appWindow.walletMode >= 2 && walletManager.isDaemonLocal(currentDaemonAddress) && !walletInitialized && status === Wallet.ConnectionStatus_Disconnected && !daemonManager.running(persistentSettings.nettype)){
-            daemonManagerDialog.open();
+        if (!isMobile && appWindow.walletMode >= 2 && walletManager.isDaemonLocal(currentDaemonAddress) && !walletInitialized && status === Wallet.ConnectionStatus_Disconnected) {
+            daemonManager.runningAsync(persistentSettings.nettype, function(running) {
+                if (!running) {
+                    daemonManagerDialog.open();
+                }
+            });
         }
         // initialize transaction history once wallet is initialized first time;
         if (!walletInitialized) {
diff --git a/src/daemon/DaemonManager.cpp b/src/daemon/DaemonManager.cpp
index ecbe1784..4277e0bb 100644
--- a/src/daemon/DaemonManager.cpp
+++ b/src/daemon/DaemonManager.cpp
@@ -243,6 +243,14 @@ bool DaemonManager::running(NetworkType::Type nettype) const
     }
     return false;
 }
+
+void DaemonManager::runningAsync(NetworkType::Type nettype, const QJSValue& callback) const
+{ 
+    m_scheduler.run([this, nettype] {
+        return QJSValueList({running(nettype)});
+    }, callback);
+}
+
 bool DaemonManager::sendCommand(const QString &cmd, NetworkType::Type nettype) const
 {
     QString message;
diff --git a/src/daemon/DaemonManager.h b/src/daemon/DaemonManager.h
index 6063c8cb..5a29ea64 100644
--- a/src/daemon/DaemonManager.h
+++ b/src/daemon/DaemonManager.h
@@ -48,7 +48,7 @@ public:
     Q_INVOKABLE bool stop(NetworkType::Type nettype);
 
     // return true if daemon process is started
-    Q_INVOKABLE bool running(NetworkType::Type nettype) const;
+    Q_INVOKABLE void runningAsync(NetworkType::Type nettype, const QJSValue& callback) const;
     // Send daemon command from qml and prints output in console window.
     Q_INVOKABLE bool sendCommand(const QString &cmd, NetworkType::Type nettype) const;
     Q_INVOKABLE void exit();
@@ -56,6 +56,7 @@ public:
 
 private:
 
+    bool running(NetworkType::Type nettype) const;
     bool sendCommand(const QString &cmd, NetworkType::Type nettype, QString &message) const;
     bool startWatcher(NetworkType::Type nettype) const;
     bool stopWatcher(NetworkType::Type nettype) const;
@@ -82,7 +83,7 @@ private:
     bool m_has_daemon = true;
     bool m_app_exit = false;
 
-    FutureScheduler m_scheduler;
+    mutable FutureScheduler m_scheduler;
 };
 
 #endif // DAEMONMANAGER_H