@@ -12,7 +12,7 @@ mod hashmap_test {
12
12
use std:: rc:: Rc ;
13
13
use std:: sync:: atomic:: Ordering :: { Acquire , Relaxed , Release } ;
14
14
use std:: sync:: atomic:: { AtomicU64 , AtomicUsize } ;
15
- use std:: sync:: Arc ;
15
+ use std:: sync:: { Arc , Barrier } ;
16
16
use tokio:: sync:: Barrier as AsyncBarrier ;
17
17
18
18
static_assertions:: assert_not_impl_all!( HashMap <Rc <String >, Rc <String >>: Send , Sync ) ;
@@ -392,6 +392,47 @@ mod hashmap_test {
392
392
}
393
393
}
394
394
395
+ #[ cfg_attr( miri, ignore) ]
396
+ #[ test]
397
+ fn insert_read ( ) {
398
+ for i in 0 ..65536 {
399
+ let hashmap: Arc < HashMap < [ u8 ; 32 ] , usize > > = Arc :: new ( HashMap :: default ( ) ) ;
400
+ let num_tasks = 16 ;
401
+ let workload_size = 65536 ;
402
+ let mut task_handles = Vec :: with_capacity ( num_tasks) ;
403
+ let barrier = Arc :: new ( Barrier :: new ( num_tasks) ) ;
404
+ for task_id in 0 ..num_tasks {
405
+ let barrier_clone = barrier. clone ( ) ;
406
+ let hashmap_clone = hashmap. clone ( ) ;
407
+ task_handles. push ( std:: thread:: spawn ( move || {
408
+ barrier_clone. wait ( ) ;
409
+ let range = ( task_id * workload_size) ..( ( task_id + 1 ) * workload_size) ;
410
+ let mut key = [ 0_u8 ; 32 ] ;
411
+ for id in range. clone ( ) {
412
+ for i in 0 ..8 {
413
+ key[ i] = ( id >> ( i * 8 ) ) as u8 ;
414
+ }
415
+ let e = hashmap_clone. entry ( key. clone ( ) ) . insert_entry ( id) ;
416
+ assert_eq ! ( e. get( ) , & id) ;
417
+ drop ( e) ;
418
+ assert ! ( hashmap_clone. read( & key, |_, _| ( ) ) . is_some( ) ) ;
419
+ }
420
+ for id in range {
421
+ for i in 0 ..8 {
422
+ key[ i] = ( id >> ( i * 8 ) ) as u8 ;
423
+ }
424
+ assert ! ( hashmap_clone. read( & key, |_, _| ( ) ) . is_some( ) ) ;
425
+ }
426
+ } ) ) ;
427
+ }
428
+ println ! ( "OK {i}" ) ;
429
+
430
+ for r in task_handles {
431
+ assert ! ( r. join( ) . is_ok( ) ) ;
432
+ }
433
+ }
434
+ }
435
+
395
436
#[ cfg_attr( miri, ignore) ]
396
437
#[ tokio:: test( flavor = "multi_thread" , worker_threads = 8 ) ]
397
438
async fn entry_next_retain ( ) {
0 commit comments