@@ -38,6 +38,8 @@ fn poll_queue(tx: mpsc::Sender<CompletionQueue>) {
38
38
pub struct EnvBuilder {
39
39
cq_count : usize ,
40
40
name_prefix : Option < String > ,
41
+ after_start : Option < Arc < dyn Fn ( ) + Send + Sync > > ,
42
+ before_stop : Option < Arc < dyn Fn ( ) + Send + Sync > > ,
41
43
}
42
44
43
45
impl EnvBuilder {
@@ -46,6 +48,8 @@ impl EnvBuilder {
46
48
EnvBuilder {
47
49
cq_count : unsafe { grpc_sys:: gpr_cpu_num_cores ( ) as usize } ,
48
50
name_prefix : None ,
51
+ after_start : None ,
52
+ before_stop : None ,
49
53
}
50
54
}
51
55
@@ -67,6 +71,18 @@ impl EnvBuilder {
67
71
self
68
72
}
69
73
74
+ /// Execute function `f` after each thread is started but before it starts doing work.
75
+ pub fn after_start < F : Fn ( ) + Send + Sync + ' static > ( mut self , f : F ) -> EnvBuilder {
76
+ self . after_start = Some ( Arc :: new ( f) ) ;
77
+ self
78
+ }
79
+
80
+ /// Execute function `f` before each thread stops.
81
+ pub fn before_stop < F : Fn ( ) + Send + Sync + ' static > ( mut self , f : F ) -> EnvBuilder {
82
+ self . before_stop = Some ( Arc :: new ( f) ) ;
83
+ self
84
+ }
85
+
70
86
/// Finalize the [`EnvBuilder`], build the [`Environment`] and initialize the gRPC library.
71
87
pub fn build ( self ) -> Environment {
72
88
unsafe {
@@ -81,7 +97,19 @@ impl EnvBuilder {
81
97
if let Some ( ref prefix) = self . name_prefix {
82
98
builder = builder. name ( format ! ( "{}-{}" , prefix, i) ) ;
83
99
}
84
- let handle = builder. spawn ( move || poll_queue ( tx_i) ) . unwrap ( ) ;
100
+ let after_start = self . after_start . clone ( ) ;
101
+ let before_stop = self . before_stop . clone ( ) ;
102
+ let handle = builder
103
+ . spawn ( move || {
104
+ if let Some ( f) = after_start {
105
+ f ( ) ;
106
+ }
107
+ poll_queue ( tx_i) ;
108
+ if let Some ( f) = before_stop {
109
+ f ( ) ;
110
+ }
111
+ } )
112
+ . unwrap ( ) ;
85
113
handles. push ( handle) ;
86
114
}
87
115
for _ in 0 ..self . cq_count {
0 commit comments