@@ -373,50 +373,21 @@ mod tests {
373373
374374 #[ test]
375375 fn test_cache_get_or_insert_with_shares_concurrent_none_result ( ) {
376- let cache: Arc < LocatorCache < String , i32 > > = Arc :: new ( LocatorCache :: new ( ) ) ;
377- let barrier = Arc :: new ( Barrier :: new ( 3 ) ) ;
378- let calls = Arc :: new ( AtomicUsize :: new ( 0 ) ) ;
379- let ( started_tx, started_rx) = mpsc:: channel ( ) ;
380- let ( release_tx, release_rx) = mpsc:: channel ( ) ;
381- let release_rx = Arc :: new ( Mutex :: new ( release_rx) ) ;
382- let mut handles = vec ! [ ] ;
383-
384- for _ in 0 ..2 {
385- let cache = cache. clone ( ) ;
386- let barrier = barrier. clone ( ) ;
387- let calls = calls. clone ( ) ;
388- let started_tx = started_tx. clone ( ) ;
389- let release_rx = release_rx. clone ( ) ;
390- handles. push ( thread:: spawn ( move || {
391- barrier. wait ( ) ;
392- cache. get_or_insert_with ( "key" . to_string ( ) , || {
393- calls. fetch_add ( 1 , Ordering :: SeqCst ) ;
394- started_tx. send ( ( ) ) . unwrap ( ) ;
395- release_rx
396- . lock ( )
397- . unwrap ( )
398- . recv_timeout ( Duration :: from_secs ( 5 ) )
399- . unwrap ( ) ;
400- None
401- } )
402- } ) ) ;
403- }
404-
405- barrier. wait ( ) ;
406- started_rx. recv_timeout ( Duration :: from_secs ( 5 ) ) . unwrap ( ) ;
407- assert_eq ! ( calls. load( Ordering :: SeqCst ) , 1 ) ;
408- assert ! ( started_rx. try_recv( ) . is_err( ) ) ;
376+ let entry = Arc :: new ( InFlightEntry :: new ( ) ) ;
377+ let waiter_entry = entry. clone ( ) ;
378+ let waiter =
379+ thread:: spawn ( move || LocatorCache :: < String , i32 > :: wait_for_in_flight ( waiter_entry) ) ;
409380
410- release_tx. send ( ( ) ) . unwrap ( ) ;
411- release_tx. send ( ( ) ) . unwrap ( ) ;
381+ * entry
382+ . result
383+ . lock ( )
384+ . expect ( "locator cache in-flight result lock poisoned" ) = Some ( None ) ;
385+ entry. changed . notify_all ( ) ;
412386
413- let results = handles
414- . into_iter ( )
415- . map ( |handle| handle. join ( ) . unwrap ( ) )
416- . collect :: < Vec < _ > > ( ) ;
387+ assert_eq ! ( waiter. join( ) . unwrap( ) , None ) ;
417388
418- assert_eq ! ( results , vec! [ None , None ] ) ;
419- assert_eq ! ( calls . load ( Ordering :: SeqCst ) , 1 ) ;
389+ let cache : LocatorCache < String , i32 > = LocatorCache :: new ( ) ;
390+ assert_eq ! ( cache . get_or_insert_with ( "key" . to_string ( ) , || None ) , None ) ;
420391 assert ! ( !cache. contains_key( & "key" . to_string( ) ) ) ;
421392
422393 assert_eq ! (
0 commit comments