LCOV - code coverage report
Current view: top level - choreo/tower - fd_tower_stakes.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 27 27 100.0 %
Date: 2026-09-17 04:28:31 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          66 :                         ulong             prev_voter_idx ) {
       9             : 
      10          66 :   fd_tower_stakes_vtr_t * pool = tower->stk_vtr_pool;
      11          66 :   if( FD_UNLIKELY( !fd_tower_stakes_vtr_pool_free( pool ) ) ) FD_LOG_CRIT(( "no free voter stakes in pool" ));
      12          66 :   FD_TEST( prev_voter_idx==ULONG_MAX || prev_voter_idx<UINT_MAX );
      13          66 :   fd_tower_stakes_vtr_t * new_voter_stake = fd_tower_stakes_vtr_pool_ele_acquire( pool );
      14          66 :   new_voter_stake->key   = (fd_tower_stakes_vtr_xid_t){ .addr = *vote_account, .slot = slot };
      15          66 :   new_voter_stake->stake = stake;
      16          66 :   new_voter_stake->prev  = (uint)prev_voter_idx;
      17          66 :   fd_tower_stakes_vtr_map_ele_insert( tower->stk_vtr_map, new_voter_stake, pool );
      18             : 
      19             :   /* Point to first vtr (head of list). */
      20             : 
      21          66 :   fd_tower_stakes_slot_t * blk = fd_tower_stakes_slot_query( tower->stk_slot_map, slot, NULL );
      22          66 :   if( FD_UNLIKELY( !blk ) ) blk = fd_tower_stakes_slot_insert( tower->stk_slot_map, slot );
      23          66 :   blk->head = (uint)fd_tower_stakes_vtr_pool_idx( pool, new_voter_stake );
      24          66 :   return (ulong)blk->head;
      25          66 : }
      26             : 
      27             : void
      28             : fd_tower_stakes_remove( fd_tower_t * tower,
      29           9 :                         ulong        slot ) {
      30             : 
      31           9 :   fd_tower_stakes_slot_t * blk = fd_tower_stakes_slot_query( tower->stk_slot_map, slot, NULL );
      32           9 :   if( FD_UNLIKELY( !blk ) ) return;
      33           3 :   uint voter_idx = blk->head;
      34             : 
      35             :   /* Remove the linked list of voters. */
      36             : 
      37           9 :   while( FD_UNLIKELY( voter_idx!=UINT_MAX ) ) {
      38           6 :     fd_tower_stakes_vtr_t * voter_stake = fd_tower_stakes_vtr_pool_ele( tower->stk_vtr_pool, voter_idx );
      39           6 :     voter_idx = voter_stake->prev;
      40           6 :     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 );
      41           6 :     if( FD_UNLIKELY( !remove ) ) FD_LOG_CRIT(( "invariant violation: voter stake does not exist in map" ));
      42           6 :     fd_tower_stakes_vtr_pool_ele_release( tower->stk_vtr_pool, voter_stake );
      43           6 :   }
      44           3 :   fd_tower_stakes_slot_remove( tower->stk_slot_map, blk );
      45           3 : }

Generated by: LCOV version 1.14