@@ -8,8 +8,7 @@ use crate::{
88 AcquireThreadHandler , DeadlockHandler , ErrorKind , ExitHandler , PanicHandler ,
99 ReleaseThreadHandler , StartHandler , ThreadPoolBuildError , ThreadPoolBuilder ,
1010} ;
11- use crossbeam_deque:: { Steal , Stealer , Worker } ;
12- use crossbeam_queue:: SegQueue ;
11+ use crossbeam_deque:: { Injector , Steal , Stealer , Worker } ;
1312use std:: any:: Any ;
1413use std:: cell:: Cell ;
1514use std:: collections:: hash_map:: DefaultHasher ;
@@ -135,7 +134,7 @@ where
135134pub struct Registry {
136135 thread_infos : Vec < ThreadInfo > ,
137136 sleep : Sleep ,
138- injected_jobs : SegQueue < JobRef > ,
137+ injected_jobs : Injector < JobRef > ,
139138 panic_handler : Option < Box < PanicHandler > > ,
140139 pub ( crate ) deadlock_handler : Option < Box < DeadlockHandler > > ,
141140 start_handler : Option < Box < StartHandler > > ,
@@ -240,7 +239,7 @@ impl Registry {
240239 let registry = Arc :: new ( Registry {
241240 thread_infos : stealers. into_iter ( ) . map ( ThreadInfo :: new) . collect ( ) ,
242241 sleep : Sleep :: new ( n_threads) ,
243- injected_jobs : SegQueue :: new ( ) ,
242+ injected_jobs : Injector :: new ( ) ,
244243 terminate_latch : CountLatch :: new ( ) ,
245244 panic_handler : builder. take_panic_handler ( ) ,
246245 deadlock_handler : builder. take_deadlock_handler ( ) ,
@@ -415,13 +414,18 @@ impl Registry {
415414 }
416415
417416 fn pop_injected_job ( & self , worker_index : usize ) -> Option < JobRef > {
418- let job = self . injected_jobs . pop ( ) . ok ( ) ;
419- if job. is_some ( ) {
420- log ! ( UninjectedWork {
421- worker: worker_index
422- } ) ;
417+ loop {
418+ match self . injected_jobs . steal ( ) {
419+ Steal :: Success ( job) => {
420+ log ! ( UninjectedWork {
421+ worker: worker_index
422+ } ) ;
423+ return Some ( job) ;
424+ }
425+ Steal :: Empty => return None ,
426+ Steal :: Retry => { }
427+ }
423428 }
424- job
425429 }
426430
427431 /// If already in a worker-thread of this registry, just execute `op`.
0 commit comments