Parcourir la source

darkfid: Use async ctrlc.

parazyd il y a 4 ans
Parent
commit
c29e1d63fa
2 fichiers modifiés avec 13 ajouts et 8 suppressions
  1. 1 1
      bin/darkfid2/Cargo.toml
  2. 12 7
      bin/darkfid2/src/main.rs

+ 1 - 1
bin/darkfid2/Cargo.toml

@@ -13,7 +13,7 @@ async-channel = "1.6.1"
 async-executor = "1.4.1"
 async-std = "1.11.0"
 async-trait = "0.1.53"
-ctrlc = "3.2.1"
+ctrlc-async = {version = "3.2.2", default-features = false, features = ["async-std"]}
 darkfi = {path = "../../", features = ["blockchain2", "wallet", "rpc", "net"]}
 easy-parallel = "3.2.0"
 futures-lite = "1.12.0"

+ 12 - 7
bin/darkfid2/src/main.rs

@@ -312,10 +312,14 @@ async fn init_wallet(wallet_path: &str, wallet_pass: &str) -> Result<WalletPtr>
 }
 
 async fn realmain(args: Args, ex: Arc<Executor<'_>>) -> Result<()> {
-    // We use this synchronous channel to block in this function, and
-    // to catch a shutdown signal, where we can clean up and exit gracefully.
-    let (signal, shutdown) = std::sync::mpsc::channel();
-    ctrlc::set_handler(move || signal.send(()).unwrap()).unwrap();
+    // We use this handler to block this function after detaching all
+    // tasks, and to catch a shutdown signal, where we can clean up and
+    // exit gracefully.
+    let (signal, shutdown) = async_channel::bounded::<()>(1);
+    ctrlc_async::set_async_handler(async move {
+        signal.send(()).await.unwrap();
+    })
+    .unwrap();
 
     // Initialize or load wallet
     let wallet = init_wallet(&args.wallet_path, &args.wallet_pass).await?;
@@ -343,12 +347,13 @@ async fn realmain(args: Args, ex: Arc<Executor<'_>>) -> Result<()> {
 
     // JSON-RPC server
     info!("Starting JSON-RPC server");
-    let _jsonrpc_task = ex.spawn(listen_and_serve(args.rpc_listen, darkfid)).detach();
+    let jsonrpc_task = ex.spawn(listen_and_serve(args.rpc_listen, darkfid)).detach();
 
-    // Block here and wait for SIGINT
-    shutdown.recv().unwrap();
+    // Wait for SIGINT
+    shutdown.recv().await?;
     print!("\r");
     info!("Caught ^C, cleaning up and exiting...");
+    drop(jsonrpc_task);
 
     // Flush dbs