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