Patchwork D8449: rust-chg: do not terminate tokio runtime until pager exits

login
register
mail settings
Submitter phabricator
Date April 16, 2020, 12:31 p.m.
Message ID <differential-rev-PHID-DREV-agzpn2o77yizitz76g5u-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/46154/
State Superseded
Headers show

Comments

phabricator - April 16, 2020, 12:31 p.m.
yuja created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  We no longer need to spawn a task just to keep the pager handle. The pager
  handle can be held by ChgUiHandler since the handler itself is not consumed
  and recreated across async calls.

REPOSITORY
  rHG Mercurial

BRANCH
  default

REVISION DETAIL
  https://phab.mercurial-scm.org/D8449

AFFECTED FILES
  rust/chg/src/main.rs
  rust/chg/src/uihandler.rs

CHANGE DETAILS




To: yuja, #hg-reviewers
Cc: mercurial-devel

Patch

diff --git a/rust/chg/src/uihandler.rs b/rust/chg/src/uihandler.rs
--- a/rust/chg/src/uihandler.rs
+++ b/rust/chg/src/uihandler.rs
@@ -9,7 +9,7 @@ 
 use std::os::unix::process::ExitStatusExt;
 use std::process::Stdio;
 use tokio;
-use tokio::process::{ChildStdin, Command};
+use tokio::process::{Child, ChildStdin, Command};
 
 use crate::message::CommandSpec;
 use crate::procutil;
@@ -31,11 +31,21 @@ 
 }
 
 /// Default cHg implementation to process requests received from server.
-pub struct ChgUiHandler {}
+pub struct ChgUiHandler {
+    pager: Option<Child>,
+}
 
 impl ChgUiHandler {
     pub fn new() -> ChgUiHandler {
-        ChgUiHandler {}
+        ChgUiHandler { pager: None }
+    }
+
+    /// Waits until the pager process exits.
+    pub async fn wait_pager(&mut self) -> io::Result<()> {
+        if let Some(p) = self.pager.take() {
+            p.await?;
+        }
+        Ok(())
     }
 }
 
@@ -51,7 +61,7 @@ 
         // otherwise the server won't get SIGPIPE if it does not write
         // anything. (issue5278)
         // kill(peerpid, SIGPIPE);
-        tokio::spawn(async { pager.await }); // just ignore errors
+        self.pager = Some(pager);
         Ok(pin)
     }
 
diff --git a/rust/chg/src/main.rs b/rust/chg/src/main.rs
--- a/rust/chg/src/main.rs
+++ b/rust/chg/src/main.rs
@@ -83,5 +83,6 @@ 
         .run_command_chg(&mut handler, env::args_os().skip(1))
         .await?;
     procutil::restore_signal_handler_once()?;
+    handler.wait_pager().await?;
     Ok(code)
 }