@@ -151,6 +151,12 @@ pub struct ThreadPoolBuilder {
151
151
/// Closure invoked on worker thread start.
152
152
main_handler : Option < Box < MainHandler > > ,
153
153
154
+ /// Closure invoked when starting computations in a thread.
155
+ acquire_thread_handler : Option < Box < AcquireThreadHandler > > ,
156
+
157
+ /// Closure invoked when blocking in a thread.
158
+ release_thread_handler : Option < Box < ReleaseThreadHandler > > ,
159
+
154
160
/// If false, worker threads will execute spawned jobs in a
155
161
/// "depth-first" fashion. If true, they will do a "breadth-first"
156
162
/// fashion. Depth-first is the default.
@@ -189,6 +195,14 @@ type ExitHandler = Fn(usize) + Send + Sync;
189
195
/// Note that this same closure may be invoked multiple times in parallel.
190
196
type MainHandler = Fn ( usize , & mut FnMut ( ) ) + Send + Sync ;
191
197
198
+ /// The type for a closure that gets invoked before starting computations in a thread.
199
+ /// Note that this same closure may be invoked multiple times in parallel.
200
+ type AcquireThreadHandler = Fn ( ) + Send + Sync ;
201
+
202
+ /// The type for a closure that gets invoked before blocking in a thread.
203
+ /// Note that this same closure may be invoked multiple times in parallel.
204
+ type ReleaseThreadHandler = Fn ( ) + Send + Sync ;
205
+
192
206
impl ThreadPoolBuilder {
193
207
/// Creates and returns a valid rayon thread pool builder, but does not initialize it.
194
208
pub fn new ( ) -> ThreadPoolBuilder {
@@ -362,6 +376,32 @@ impl ThreadPoolBuilder {
362
376
self . breadth_first
363
377
}
364
378
379
+ /// Takes the current acquire thread callback, leaving `None`.
380
+ fn take_acquire_thread_handler ( & mut self ) -> Option < Box < AcquireThreadHandler > > {
381
+ self . acquire_thread_handler . take ( )
382
+ }
383
+
384
+ /// Set a callback to be invoked when starting computations in a thread.
385
+ pub fn acquire_thread_handler < H > ( mut self , acquire_thread_handler : H ) -> ThreadPoolBuilder
386
+ where H : Fn ( ) + Send + Sync + ' static
387
+ {
388
+ self . acquire_thread_handler = Some ( Box :: new ( acquire_thread_handler) ) ;
389
+ self
390
+ }
391
+
392
+ /// Takes the current release thread callback, leaving `None`.
393
+ fn take_release_thread_handler ( & mut self ) -> Option < Box < ReleaseThreadHandler > > {
394
+ self . release_thread_handler . take ( )
395
+ }
396
+
397
+ /// Set a callback to be invoked when blocking in thread.
398
+ pub fn release_thread_handler < H > ( mut self , release_thread_handler : H ) -> ThreadPoolBuilder
399
+ where H : Fn ( ) + Send + Sync + ' static
400
+ {
401
+ self . release_thread_handler = Some ( Box :: new ( release_thread_handler) ) ;
402
+ self
403
+ }
404
+
365
405
/// Takes the current deadlock callback, leaving `None`.
366
406
fn take_deadlock_handler ( & mut self ) -> Option < Box < DeadlockHandler > > {
367
407
self . deadlock_handler . take ( )
@@ -545,10 +585,12 @@ impl fmt::Debug for ThreadPoolBuilder {
545
585
ref get_thread_name,
546
586
ref panic_handler,
547
587
ref stack_size,
548
- ref deadlock_handler,
588
+ ref deadlock_handler,
549
589
ref start_handler,
550
590
ref main_handler,
551
591
ref exit_handler,
592
+ ref acquire_thread_handler,
593
+ ref release_thread_handler,
552
594
ref breadth_first,
553
595
} = * self ;
554
596
@@ -566,6 +608,8 @@ impl fmt::Debug for ThreadPoolBuilder {
566
608
let start_handler = start_handler. as_ref ( ) . map ( |_| ClosurePlaceholder ) ;
567
609
let exit_handler = exit_handler. as_ref ( ) . map ( |_| ClosurePlaceholder ) ;
568
610
let main_handler = main_handler. as_ref ( ) . map ( |_| ClosurePlaceholder ) ;
611
+ let acquire_thread_handler = acquire_thread_handler. as_ref ( ) . map ( |_| ClosurePlaceholder ) ;
612
+ let release_thread_handler = release_thread_handler. as_ref ( ) . map ( |_| ClosurePlaceholder ) ;
569
613
570
614
f. debug_struct ( "ThreadPoolBuilder" )
571
615
. field ( "num_threads" , num_threads)
@@ -576,6 +620,8 @@ impl fmt::Debug for ThreadPoolBuilder {
576
620
. field ( "start_handler" , & start_handler)
577
621
. field ( "exit_handler" , & exit_handler)
578
622
. field ( "main_handler" , & main_handler)
623
+ . field ( "acquire_thread_handler" , & acquire_thread_handler)
624
+ . field ( "release_thread_handler" , & release_thread_handler)
579
625
. field ( "breadth_first" , & breadth_first)
580
626
. finish ( )
581
627
}
0 commit comments