@@ -399,24 +399,24 @@ fd_fib4_fprintf( fd_fib4_t const * fib,
399
399
fd_fib4_hmap_t hmap [1 ];
400
400
fd_fib4_hmap_entry_t * elems = fd_fib4_hmap_ele_mem ( (fd_fib4_t * )fib );
401
401
FD_TEST ( fd_fib4_hmap_join ( hmap , fd_fib4_hmap_mem ( (fd_fib4_t * )fib ), elems ) );
402
- ulong elem_max = fd_fib4_hmap_get_ele_max ( fib -> hmap_max );
403
- ulong lock_cnt = fd_fib4_hmap_get_lock_cnt ( elem_max );
404
- ulong ignored [ fd_fib4_hmap_lock_max ( ) ];
405
- FD_TEST ( fd_fib4_hmap_lock_range ( hmap , 0 , lock_cnt , FD_MAP_FLAG_BLOCKING | FD_MAP_FLAG_RDONLY , ignored )== FD_MAP_SUCCESS );
406
-
407
- // loop through the hmap elements
402
+ ulong elem_max = fd_fib4_hmap_get_ele_max ( fib -> hmap_max );
408
403
for ( ulong i = 0 ; i < elem_max ; i ++ ) {
409
- if ( elems [i ].dst_addr != 0 ) {
404
+ ulong * lock = hmap -> lock + fd_fib4_hmap_ele_lock ( hmap , i );
405
+ fd_fib4_hmap_entry_t e ;
406
+ for (;;) {
407
+ ulong ver = fd_fib4_hmap_private_try ( lock );
408
+ e = FD_VOLATILE_CONST ( elems [ i ] );
409
+ if ( FD_LIKELY ( fd_fib4_hmap_private_test ( lock , 1UL , & ver , 0UL , 1UL )== FD_MAP_SUCCESS ) ) break ;
410
+ }
411
+ if ( e .dst_addr != 0 ) {
410
412
fd_fib4_key_t key ;
411
- key .addr = fd_uint_bswap ( elems [ i ] .dst_addr );
413
+ key .addr = fd_uint_bswap ( e .dst_addr );
412
414
key .mask = 31 ;
413
415
key .prio = 0 ;
414
- fd_fib4_fprintf_route ( & key , & elems [ i ] .next_hop , file );
416
+ fd_fib4_fprintf_route ( & key , & e .next_hop , file );
415
417
}
416
418
}
417
419
418
- fd_fib4_hmap_unlock_range ( hmap , 0 , lock_cnt , ignored );
419
-
420
420
return 0 ;
421
421
}
422
422
0 commit comments