From ed6fde7f2899d146dbfce64598c3c8df9a147704 Mon Sep 17 00:00:00 2001
From: Lee *!* Clagett <vtnerd@users.noreply.github.com>
Date: Wed, 23 Oct 2024 15:45:07 -0400
Subject: [PATCH] Fixing shutdown request during sync-phase (#143)

---
 src/scanner.cpp | 12 +++++++++---
 src/scanner.h   |  5 ++++-
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/src/scanner.cpp b/src/scanner.cpp
index 740ce1e..739e21f 100644
--- a/src/scanner.cpp
+++ b/src/scanner.cpp
@@ -1069,7 +1069,7 @@ namespace lws
     }
 
     template<typename R, typename Q>
-    expect<typename R::response> fetch_chain(const scanner_sync& self, rpc::client& client, const char* endpoint, const Q& req)
+    expect<typename R::response> fetch_chain(scanner_sync& self, rpc::client& client, const char* endpoint, const Q& req)
     {
       expect<void> sent{lws::error::daemon_timeout};
 
@@ -1078,6 +1078,9 @@ namespace lws
 
       while (!(sent = client.send(std::move(msg), std::chrono::seconds{1})))
       {
+        // Run possible SIGINT handler
+        self.io_.poll_one();
+        self.io_.reset();
         if (self.has_shutdown())
           return {lws::error::signal_abort_process};
 
@@ -1093,6 +1096,9 @@ namespace lws
 
       while (!(resp = client.get_message(std::chrono::seconds{1})))
       {
+        // Run possible SIGINT handler
+        self.io_.poll_one();
+        self.io_.reset();
         if (self.has_shutdown())
           return {lws::error::signal_abort_process};
 
@@ -1106,7 +1112,7 @@ namespace lws
     }
 
     // does not validate blockchain hashes
-    expect<rpc::client> sync_quick(const scanner_sync& self, db::storage disk, rpc::client client)
+    expect<rpc::client> sync_quick(scanner_sync& self, db::storage disk, rpc::client client)
     {
       MINFO("Starting blockchain sync with daemon");
 
@@ -1145,7 +1151,7 @@ namespace lws
     } 
  
     // validates blockchain hashes
-    expect<rpc::client> sync_full(const scanner_sync& self, db::storage disk, rpc::client client)
+    expect<rpc::client> sync_full(scanner_sync& self, db::storage disk, rpc::client client)
     {
       MINFO("Starting blockchain sync with daemon");
 
diff --git a/src/scanner.h b/src/scanner.h
index 45774fd..2efd4a0 100644
--- a/src/scanner.h
+++ b/src/scanner.h
@@ -91,7 +91,10 @@ namespace lws
     void shutdown() { shutdown_ = true; stop(); }
   };
 
-  //! Scans all active `db::account`s. Detects if another process changes active list.
+  /*! Scans all active `db::account`s. Detects if another process changes
+    active list.
+
+    \note Everything except `sync` and `run` is thread-safe. */
   class scanner
   {
     db::storage disk_;