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