diff options
author | Haibo Huang <hhb@google.com> | 2020-11-08 11:41:21 -0800 |
---|---|---|
committer | Haibo Huang <hhb@google.com> | 2020-11-08 11:41:21 -0800 |
commit | ee7a229247011355da67df293220acc9175448e2 (patch) | |
tree | 71b66a4c98a5ac5b2d407b3273ceae8adaf1744e /src/env.rs | |
parent | 8beb80ba905c51753551535c0be0d238654b1fb2 (diff) | |
download | grpcio-ee7a229247011355da67df293220acc9175448e2.tar.gz |
Upgrade rust/crates/grpcio to 0.7.0
Test: make
Change-Id: I3556271e3c96976ec7299687e60f556449a64f7d
Diffstat (limited to 'src/env.rs')
-rw-r--r-- | src/env.rs | 30 |
1 files changed, 29 insertions, 1 deletions
@@ -38,6 +38,8 @@ fn poll_queue(tx: mpsc::Sender<CompletionQueue>) { pub struct EnvBuilder { cq_count: usize, name_prefix: Option<String>, + after_start: Option<Arc<dyn Fn() + Send + Sync>>, + before_stop: Option<Arc<dyn Fn() + Send + Sync>>, } impl EnvBuilder { @@ -46,6 +48,8 @@ impl EnvBuilder { EnvBuilder { cq_count: unsafe { grpc_sys::gpr_cpu_num_cores() as usize }, name_prefix: None, + after_start: None, + before_stop: None, } } @@ -67,6 +71,18 @@ impl EnvBuilder { self } + /// Execute function `f` after each thread is started but before it starts doing work. + pub fn after_start<F: Fn() + Send + Sync + 'static>(mut self, f: F) -> EnvBuilder { + self.after_start = Some(Arc::new(f)); + self + } + + /// Execute function `f` before each thread stops. + pub fn before_stop<F: Fn() + Send + Sync + 'static>(mut self, f: F) -> EnvBuilder { + self.before_stop = Some(Arc::new(f)); + self + } + /// Finalize the [`EnvBuilder`], build the [`Environment`] and initialize the gRPC library. pub fn build(self) -> Environment { unsafe { @@ -81,7 +97,19 @@ impl EnvBuilder { if let Some(ref prefix) = self.name_prefix { builder = builder.name(format!("{}-{}", prefix, i)); } - let handle = builder.spawn(move || poll_queue(tx_i)).unwrap(); + let after_start = self.after_start.clone(); + let before_stop = self.before_stop.clone(); + let handle = builder + .spawn(move || { + if let Some(f) = after_start { + f(); + } + poll_queue(tx_i); + if let Some(f) = before_stop { + f(); + } + }) + .unwrap(); handles.push(handle); } for _ in 0..self.cq_count { |