LCOV - code coverage report
Current view: top level - flamenco/progcache - fd_progcache_clock.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 45 45 100.0 %
Date: 2026-04-01 06:30:45 Functions: 2 2 100.0 %

          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 : }

Generated by: LCOV version 1.14