LCOV - code coverage report
Current view: top level - choreo/tower - fd_tower_stakes.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 16 26 61.5 %
Date: 2026-06-09 08:01:34 Functions: 2 2 100.0 %

          Line data    Source code
       1             : #include "fd_tower.h"
       2             : 
       3             : ulong
       4             : fd_tower_stakes_insert( fd_tower_t *      tower,
       5             :                         ulong             slot,
       6             :                         fd_hash_t const * vote_account,
       7             :                         ulong             stake,
       8          60 :                         ulong             prev_voter_idx ) {
       9             : 
      10          60 :   fd_tower_stakes_vtr_t * pool = tower->stk_vtr_pool;
      11          60 :   if( FD_UNLIKELY( !fd_tower_stakes_vtr_pool_free( pool ) ) ) FD_LOG_CRIT(( "no free voter stakes in pool" ));
      12          60 :   fd_tower_stakes_vtr_t * new_voter_stake = fd_tower_stakes_vtr_pool_ele_acquire( pool );
      13          60 :   new_voter_stake->key   = (fd_tower_stakes_vtr_xid_t){ .addr = *vote_account, .slot = slot };
      14          60 :   new_voter_stake->stake = stake;
      15          60 :   new_voter_stake->prev  = prev_voter_idx;
      16          60 :   fd_tower_stakes_vtr_map_ele_insert( tower->stk_vtr_map, new_voter_stake, pool );
      17             : 
      18             :   /* Point to first vtr (head of list). */
      19             : 
      20          60 :   fd_tower_stakes_slot_t * blk = fd_tower_stakes_slot_query( tower->stk_slot_map, slot, NULL );
      21          60 :   if( FD_UNLIKELY( !blk ) ) blk = fd_tower_stakes_slot_insert( tower->stk_slot_map, slot );
      22          60 :   blk->head = fd_tower_stakes_vtr_pool_idx( pool, new_voter_stake );
      23          60 :   return blk->head;
      24          60 : }
      25             : 
      26             : void
      27             : fd_tower_stakes_remove( fd_tower_t * tower,
      28           6 :                         ulong        slot ) {
      29             : 
      30           6 :   fd_tower_stakes_slot_t * blk = fd_tower_stakes_slot_query( tower->stk_slot_map, slot, NULL );
      31           6 :   if( FD_UNLIKELY( !blk ) ) return;
      32           0 :   ulong voter_idx = blk->head;
      33             : 
      34             :   /* Remove the linked list of voters. */
      35             : 
      36           0 :   while( FD_UNLIKELY( voter_idx!=ULONG_MAX ) ) {
      37           0 :     fd_tower_stakes_vtr_t * voter_stake = fd_tower_stakes_vtr_pool_ele( tower->stk_vtr_pool, voter_idx );
      38           0 :     voter_idx = voter_stake->prev;
      39           0 :     fd_tower_stakes_vtr_t * remove = fd_tower_stakes_vtr_map_ele_remove( tower->stk_vtr_map, &voter_stake->key, NULL, tower->stk_vtr_pool );
      40           0 :     if( FD_UNLIKELY( !remove ) ) FD_LOG_CRIT(( "invariant violation: voter stake does not exist in map" ));
      41           0 :     fd_tower_stakes_vtr_pool_ele_release( tower->stk_vtr_pool, voter_stake );
      42           0 :   }
      43           0 :   fd_tower_stakes_slot_remove( tower->stk_slot_map, blk );
      44           0 : }

Generated by: LCOV version 1.14