@@ -151,6 +151,12 @@ pub struct ThreadPoolBuilder {
151151 /// Closure invoked on worker thread start.
152152 main_handler : Option < Box < MainHandler > > ,
153153
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+
154160 /// If false, worker threads will execute spawned jobs in a
155161 /// "depth-first" fashion. If true, they will do a "breadth-first"
156162 /// fashion. Depth-first is the default.
@@ -189,6 +195,14 @@ type ExitHandler = Fn(usize) + Send + Sync;
189195/// Note that this same closure may be invoked multiple times in parallel.
190196type MainHandler = Fn ( usize , & mut FnMut ( ) ) + Send + Sync ;
191197
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+
192206impl ThreadPoolBuilder {
193207 /// Creates and returns a valid rayon thread pool builder, but does not initialize it.
194208 pub fn new ( ) -> ThreadPoolBuilder {
@@ -362,6 +376,32 @@ impl ThreadPoolBuilder {
362376 self . breadth_first
363377 }
364378
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+
365405 /// Takes the current deadlock callback, leaving `None`.
366406 fn take_deadlock_handler ( & mut self ) -> Option < Box < DeadlockHandler > > {
367407 self . deadlock_handler . take ( )
@@ -545,10 +585,12 @@ impl fmt::Debug for ThreadPoolBuilder {
545585 ref get_thread_name,
546586 ref panic_handler,
547587 ref stack_size,
548- ref deadlock_handler,
588+ ref deadlock_handler,
549589 ref start_handler,
550590 ref main_handler,
551591 ref exit_handler,
592+ ref acquire_thread_handler,
593+ ref release_thread_handler,
552594 ref breadth_first,
553595 } = * self ;
554596
@@ -566,6 +608,8 @@ impl fmt::Debug for ThreadPoolBuilder {
566608 let start_handler = start_handler. as_ref ( ) . map ( |_| ClosurePlaceholder ) ;
567609 let exit_handler = exit_handler. as_ref ( ) . map ( |_| ClosurePlaceholder ) ;
568610 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 ) ;
569613
570614 f. debug_struct ( "ThreadPoolBuilder" )
571615 . field ( "num_threads" , num_threads)
@@ -576,6 +620,8 @@ impl fmt::Debug for ThreadPoolBuilder {
576620 . field ( "start_handler" , & start_handler)
577621 . field ( "exit_handler" , & exit_handler)
578622 . field ( "main_handler" , & main_handler)
623+ . field ( "acquire_thread_handler" , & acquire_thread_handler)
624+ . field ( "release_thread_handler" , & release_thread_handler)
579625 . field ( "breadth_first" , & breadth_first)
580626 . finish ( )
581627 }
0 commit comments