@@ -162,6 +162,12 @@ pub struct ThreadPoolBuilder<S = DefaultSpawn> {
162
162
/// Closure invoked on worker thread start.
163
163
main_handler : Option < Box < MainHandler > > ,
164
164
165
+ /// Closure invoked when starting computations in a thread.
166
+ acquire_thread_handler : Option < Box < AcquireThreadHandler > > ,
167
+
168
+ /// Closure invoked when blocking in a thread.
169
+ release_thread_handler : Option < Box < ReleaseThreadHandler > > ,
170
+
165
171
/// If false, worker threads will execute spawned jobs in a
166
172
/// "depth-first" fashion. If true, they will do a "breadth-first"
167
173
/// fashion. Depth-first is the default.
@@ -205,6 +211,8 @@ impl Default for ThreadPoolBuilder {
205
211
exit_handler : None ,
206
212
main_handler : None ,
207
213
deadlock_handler : None ,
214
+ acquire_thread_handler : None ,
215
+ release_thread_handler : None ,
208
216
spawn_handler : DefaultSpawn ,
209
217
breadth_first : false ,
210
218
}
@@ -217,6 +225,14 @@ impl Default for ThreadPoolBuilder {
217
225
/// Note that this same closure may be invoked multiple times in parallel.
218
226
type MainHandler = Fn ( usize , & mut FnMut ( ) ) + Send + Sync ;
219
227
228
+ /// The type for a closure that gets invoked before starting computations in a thread.
229
+ /// Note that this same closure may be invoked multiple times in parallel.
230
+ type AcquireThreadHandler = Fn ( ) + Send + Sync ;
231
+
232
+ /// The type for a closure that gets invoked before blocking in a thread.
233
+ /// Note that this same closure may be invoked multiple times in parallel.
234
+ type ReleaseThreadHandler = Fn ( ) + Send + Sync ;
235
+
220
236
impl ThreadPoolBuilder {
221
237
/// Creates and returns a valid rayon thread pool builder, but does not initialize it.
222
238
pub fn new ( ) -> Self {
@@ -399,6 +415,8 @@ impl<S> ThreadPoolBuilder<S> {
399
415
exit_handler : self . exit_handler ,
400
416
main_handler : self . main_handler ,
401
417
deadlock_handler : self . deadlock_handler ,
418
+ acquire_thread_handler : self . acquire_thread_handler ,
419
+ release_thread_handler : self . release_thread_handler ,
402
420
breadth_first : self . breadth_first ,
403
421
}
404
422
}
@@ -557,6 +575,34 @@ impl<S> ThreadPoolBuilder<S> {
557
575
self . breadth_first
558
576
}
559
577
578
+ /// Takes the current acquire thread callback, leaving `None`.
579
+ fn take_acquire_thread_handler ( & mut self ) -> Option < Box < AcquireThreadHandler > > {
580
+ self . acquire_thread_handler . take ( )
581
+ }
582
+
583
+ /// Set a callback to be invoked when starting computations in a thread.
584
+ pub fn acquire_thread_handler < H > ( mut self , acquire_thread_handler : H ) -> Self
585
+ where
586
+ H : Fn ( ) + Send + Sync + ' static ,
587
+ {
588
+ self . acquire_thread_handler = Some ( Box :: new ( acquire_thread_handler) ) ;
589
+ self
590
+ }
591
+
592
+ /// Takes the current release thread callback, leaving `None`.
593
+ fn take_release_thread_handler ( & mut self ) -> Option < Box < ReleaseThreadHandler > > {
594
+ self . release_thread_handler . take ( )
595
+ }
596
+
597
+ /// Set a callback to be invoked when blocking in thread.
598
+ pub fn release_thread_handler < H > ( mut self , release_thread_handler : H ) -> Self
599
+ where
600
+ H : Fn ( ) + Send + Sync + ' static ,
601
+ {
602
+ self . release_thread_handler = Some ( Box :: new ( release_thread_handler) ) ;
603
+ self
604
+ }
605
+
560
606
/// Takes the current deadlock callback, leaving `None`.
561
607
fn take_deadlock_handler ( & mut self ) -> Option < Box < DeadlockHandler > > {
562
608
self . deadlock_handler . take ( )
@@ -746,6 +792,8 @@ impl<S> fmt::Debug for ThreadPoolBuilder<S> {
746
792
ref start_handler,
747
793
ref main_handler,
748
794
ref exit_handler,
795
+ ref acquire_thread_handler,
796
+ ref release_thread_handler,
749
797
spawn_handler : _,
750
798
ref breadth_first,
751
799
} = * self ;
@@ -764,6 +812,8 @@ impl<S> fmt::Debug for ThreadPoolBuilder<S> {
764
812
let start_handler = start_handler. as_ref ( ) . map ( |_| ClosurePlaceholder ) ;
765
813
let exit_handler = exit_handler. as_ref ( ) . map ( |_| ClosurePlaceholder ) ;
766
814
let main_handler = main_handler. as_ref ( ) . map ( |_| ClosurePlaceholder ) ;
815
+ let acquire_thread_handler = acquire_thread_handler. as_ref ( ) . map ( |_| ClosurePlaceholder ) ;
816
+ let release_thread_handler = release_thread_handler. as_ref ( ) . map ( |_| ClosurePlaceholder ) ;
767
817
768
818
f. debug_struct ( "ThreadPoolBuilder" )
769
819
. field ( "num_threads" , num_threads)
@@ -774,6 +824,8 @@ impl<S> fmt::Debug for ThreadPoolBuilder<S> {
774
824
. field ( "start_handler" , & start_handler)
775
825
. field ( "exit_handler" , & exit_handler)
776
826
. field ( "main_handler" , & main_handler)
827
+ . field ( "acquire_thread_handler" , & acquire_thread_handler)
828
+ . field ( "release_thread_handler" , & release_thread_handler)
777
829
. field ( "breadth_first" , & breadth_first)
778
830
. finish ( )
779
831
}
0 commit comments