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 153 : ulong rec_max ) { 9 153 : fd_memset( cbits, 0, fd_prog_cbits_footprint( rec_max ) ); 10 153 : } 11 : 12 : void 13 : fd_prog_clock_evict( fd_progcache_t * cache, 14 : ulong rec_rem_, 15 15 : ulong heap_rem_ ) { 16 15 : fd_progcache_join_t * join = cache->join; 17 15 : fd_progcache_shmem_t * shmem = join->shmem; 18 15 : fd_progcache_rec_t * rec0 = join->rec.pool->ele; 19 15 : ulong rec_max = join->rec.pool->ele_max; 20 15 : atomic_ulong * cbits = join->clock.bits; 21 : 22 : /* Fetch and lock CLOCK head */ 23 15 : fd_rwlock_write( &shmem->clock.lock ); 24 15 : ulong head = shmem->clock.head; 25 15 : if( FD_UNLIKELY( head >= rec_max ) ) head = 0UL; 26 : 27 15 : long rec_rem = (long)rec_rem_; 28 15 : long heap_rem = (long)heap_rem_; 29 15 : ulong iter_rem = 2UL*rec_max; 30 327 : while( (rec_rem>0L || heap_rem>0L) && iter_rem ) { 31 312 : iter_rem--; 32 312 : atomic_ulong * slot_p = fd_prog_cbits_slot( cbits, head ); 33 : 34 312 : ulong slot = atomic_load_explicit( slot_p, memory_order_relaxed ); 35 312 : int visited = fd_ulong_extract_bit( slot, fd_prog_visited_bit( head ) ); 36 312 : int exists = fd_ulong_extract_bit( slot, fd_prog_exists_bit ( head ) ); 37 312 : fd_racesan_hook( "prog_clock_evict:post_load_bits" ); 38 : 39 312 : 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 312 : head++; 57 312 : if( head>=rec_max ) head = 0UL; 58 312 : } 59 : 60 : /* Write back and unlock CLOCK head */ 61 15 : shmem->clock.head = head; 62 15 : fd_rwlock_unwrite( &shmem->clock.lock ); 63 : 64 15 : fd_prog_reclaim_work( join ); 65 15 : }