aboutsummaryrefslogtreecommitdiff
path: root/src/env.rs
diff options
context:
space:
mode:
authorHaibo Huang <hhb@google.com>2020-11-08 11:41:21 -0800
committerHaibo Huang <hhb@google.com>2020-11-08 11:41:21 -0800
commitee7a229247011355da67df293220acc9175448e2 (patch)
tree71b66a4c98a5ac5b2d407b3273ceae8adaf1744e /src/env.rs
parent8beb80ba905c51753551535c0be0d238654b1fb2 (diff)
downloadgrpcio-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.rs30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/env.rs b/src/env.rs
index 8bad45e..5c2e199 100644
--- a/src/env.rs
+++ b/src/env.rs
@@ -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 {