@@ -162,6 +162,12 @@ pub struct ThreadPoolBuilder<S = DefaultSpawn> {
162162    /// Closure invoked on worker thread start. 
163163     main_handler :  Option < Box < MainHandler > > , 
164164
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+ 
165171    /// If false, worker threads will execute spawned jobs in a 
166172     /// "depth-first" fashion. If true, they will do a "breadth-first" 
167173     /// fashion. Depth-first is the default. 
@@ -205,6 +211,8 @@ impl Default for ThreadPoolBuilder {
205211            exit_handler :  None , 
206212            main_handler :  None , 
207213            deadlock_handler :  None , 
214+             acquire_thread_handler :  None , 
215+             release_thread_handler :  None , 
208216            spawn_handler :  DefaultSpawn , 
209217            breadth_first :  false , 
210218        } 
@@ -217,6 +225,14 @@ impl Default for ThreadPoolBuilder {
217225/// Note that this same closure may be invoked multiple times in parallel. 
218226type  MainHandler  = Fn ( usize ,  & mut  FnMut ( ) )  + Send  + Sync ; 
219227
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+ 
220236impl  ThreadPoolBuilder  { 
221237    /// Creates and returns a valid rayon thread pool builder, but does not initialize it. 
222238     pub  fn  new ( )  -> Self  { 
@@ -399,6 +415,8 @@ impl<S> ThreadPoolBuilder<S> {
399415            exit_handler :  self . exit_handler , 
400416            main_handler :  self . main_handler , 
401417            deadlock_handler :  self . deadlock_handler , 
418+             acquire_thread_handler :  self . acquire_thread_handler , 
419+             release_thread_handler :  self . release_thread_handler , 
402420            breadth_first :  self . breadth_first , 
403421        } 
404422    } 
@@ -557,6 +575,34 @@ impl<S> ThreadPoolBuilder<S> {
557575        self . breadth_first 
558576    } 
559577
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+ 
560606    /// Takes the current deadlock callback, leaving `None`. 
561607     fn  take_deadlock_handler ( & mut  self )  -> Option < Box < DeadlockHandler > >  { 
562608        self . deadlock_handler . take ( ) 
@@ -746,6 +792,8 @@ impl<S> fmt::Debug for ThreadPoolBuilder<S> {
746792            ref  start_handler, 
747793            ref  main_handler, 
748794            ref  exit_handler, 
795+             ref  acquire_thread_handler, 
796+             ref  release_thread_handler, 
749797            spawn_handler :  _, 
750798            ref  breadth_first, 
751799        }  = * self ; 
@@ -764,6 +812,8 @@ impl<S> fmt::Debug for ThreadPoolBuilder<S> {
764812        let  start_handler = start_handler. as_ref ( ) . map ( |_| ClosurePlaceholder ) ; 
765813        let  exit_handler = exit_handler. as_ref ( ) . map ( |_| ClosurePlaceholder ) ; 
766814        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 ) ; 
767817
768818        f. debug_struct ( "ThreadPoolBuilder" ) 
769819            . field ( "num_threads" ,  num_threads) 
@@ -774,6 +824,8 @@ impl<S> fmt::Debug for ThreadPoolBuilder<S> {
774824            . field ( "start_handler" ,  & start_handler) 
775825            . field ( "exit_handler" ,  & exit_handler) 
776826            . field ( "main_handler" ,  & main_handler) 
827+             . field ( "acquire_thread_handler" ,  & acquire_thread_handler) 
828+             . field ( "release_thread_handler" ,  & release_thread_handler) 
777829            . field ( "breadth_first" ,  & breadth_first) 
778830            . finish ( ) 
779831    } 
0 commit comments