Line data Source code
1 : #include "fd_progcache_user.h" 2 : #include "fd_progcache_clock.h" 3 : #include "fd_progcache_reclaim.h" 4 : #include "../../util/racesan/fd_racesan_target.h" 5 : 6 : void 7 : fd_prog_clock_init( atomic_ulong * cbits, 8 135 : ulong rec_max ) { 9 135 : fd_memset( cbits, 0, fd_prog_cbits_footprint( rec_max ) ); 10 135 : } 11 : 12 : void 13 : fd_prog_clock_evict( fd_progcache_t * cache, 14 : ulong rec_rem_, 15 2469 : ulong heap_rem_ ) { 16 2469 : fd_progcache_join_t * join = cache->join; 17 2469 : fd_progcache_shmem_t * shmem = join->shmem; 18 2469 : fd_progcache_rec_t * rec0 = join->rec.pool->ele; 19 2469 : ulong rec_max = join->rec.pool->ele_max; 20 2469 : atomic_ulong * cbits = join->clock.bits; 21 : 22 : /* Fetch and lock CLOCK head */ 23 2469 : fd_rwlock_write( &shmem->clock.lock ); 24 2469 : ulong head = shmem->clock.head; 25 2469 : if( FD_UNLIKELY( head >= rec_max ) ) head = 0UL; 26 : 27 2469 : long rec_rem = (long)rec_rem_; 28 2469 : long heap_rem = (long)heap_rem_; 29 2469 : ulong iter_rem = 2UL*rec_max; 30 1259229 : while( (rec_rem>0L || heap_rem>0L) && iter_rem ) { 31 1256760 : iter_rem--; 32 1256760 : atomic_ulong * slot_p = fd_prog_cbits_slot( cbits, head ); 33 : 34 1256760 : ulong slot = atomic_load_explicit( slot_p, memory_order_relaxed ); 35 1256760 : int visited = fd_ulong_extract_bit( slot, fd_prog_visited_bit( head ) ); 36 1256760 : int exists = fd_ulong_extract_bit( slot, fd_prog_exists_bit ( head ) ); 37 1256760 : fd_racesan_hook( "prog_clock_evict:post_load_bits" ); 38 : 39 1256760 : if( exists ) { 40 30 : ulong mask = 0UL; 41 30 : if( visited ) { 42 9 : mask = 1UL<<fd_prog_visited_bit( head ); 43 21 : } else { 44 21 : long res = fd_prog_delete_rec( cache->join, rec0+head ); 45 21 : if( res>=0L ) { 46 18 : rec_rem--; 47 18 : heap_rem -= res; 48 18 : cache->metrics->evict_cnt++; 49 18 : cache->metrics->evict_tot_sz += (ulong)res; 50 18 : } 51 21 : mask = 3UL<<fd_prog_visited_bit( head ); 52 21 : } 53 30 : atomic_fetch_and_explicit( slot_p, ~mask, memory_order_relaxed ); 54 30 : } 55 : 56 1256760 : head++; 57 1256760 : if( head>=rec_max ) head = 0UL; 58 1256760 : } 59 : 60 : /* Write back and unlock CLOCK head */ 61 2469 : shmem->clock.head = head; 62 2469 : fd_rwlock_unwrite( &shmem->clock.lock ); 63 : 64 2469 : fd_prog_reclaim_work( join ); 65 2469 : }