Line data Source code
1 : #ifndef HEADER_fd_src_flamenco_runtime_fd_bank_hash_cmp_h 2 : #define HEADER_fd_src_flamenco_runtime_fd_bank_hash_cmp_h 3 : 4 : #include "../fd_flamenco_base.h" 5 : #include "../types/fd_types_custom.h" 6 : 7 : struct fd_bank_hash_cmp_entry { 8 : ulong slot; 9 : uint hash; 10 : fd_hash_t ours; 11 : fd_hash_t theirs[8]; 12 : ulong stakes[8]; 13 : ulong cnt; 14 : int overflow; 15 : }; 16 : typedef struct fd_bank_hash_cmp_entry fd_bank_hash_cmp_entry_t; 17 : #define MAP_NAME fd_bank_hash_cmp_map 18 0 : #define MAP_T fd_bank_hash_cmp_entry_t 19 0 : #define MAP_KEY slot 20 0 : #define MAP_KEY_NULL ULONG_MAX 21 0 : #define MAP_KEY_INVAL(k) ((k)==ULONG_MAX) 22 3 : #define MAP_LG_SLOT_CNT (16) /* 0.25 fill ratio */ 23 : #include "../../util/tmpl/fd_map.c" 24 : 25 : struct fd_bank_hash_cmp { 26 : ulong map_offset; 27 : ulong cnt; 28 : ulong watermark; /* */ 29 : ulong total_stake; 30 : volatile int lock; 31 : }; 32 : typedef struct fd_bank_hash_cmp fd_bank_hash_cmp_t; 33 : 34 : FD_PROTOTYPES_BEGIN 35 : 36 : static inline void 37 : fd_bank_hash_cmp_set_map_offset( fd_bank_hash_cmp_t * bank_hash_cmp, 38 0 : uchar * map_mem ) { 39 0 : bank_hash_cmp->map_offset = (ulong)map_mem - (ulong)bank_hash_cmp; 40 0 : } 41 : 42 : static inline fd_bank_hash_cmp_entry_t * 43 0 : fd_bank_hash_cmp_get_map( fd_bank_hash_cmp_t * bank_hash_cmp ) { 44 0 : return fd_bank_hash_cmp_map_join( (uchar *)bank_hash_cmp + bank_hash_cmp->map_offset ); 45 0 : } 46 : 47 : static inline ulong 48 15 : fd_bank_hash_cmp_align( void ) { 49 15 : return 128UL; 50 15 : } 51 : 52 : FD_FN_CONST static inline ulong 53 3 : fd_bank_hash_cmp_footprint( void ) { 54 : /* clang-format off */ 55 3 : return FD_LAYOUT_FINI( FD_LAYOUT_APPEND( FD_LAYOUT_APPEND( FD_LAYOUT_INIT, 56 3 : fd_bank_hash_cmp_align(), sizeof(fd_bank_hash_cmp_t) ), 57 3 : fd_bank_hash_cmp_map_align(), fd_bank_hash_cmp_map_footprint() ), 58 3 : fd_bank_hash_cmp_align() ); 59 : /* clang-format on */ 60 3 : } 61 : 62 : void * 63 : fd_bank_hash_cmp_new( void * mem ); 64 : 65 : fd_bank_hash_cmp_t * 66 : fd_bank_hash_cmp_join( void * bank_hash_cmp ); 67 : 68 : void * 69 : fd_bank_hash_cmp_leave( fd_bank_hash_cmp_t const * bank_hash_cmp ); 70 : 71 : void * 72 : fd_bank_hash_cmp_delete( void * bank_hash_cmp ); 73 : 74 : void 75 : fd_bank_hash_cmp_lock( fd_bank_hash_cmp_t * bank_hash_cmp ); 76 : 77 : void 78 : fd_bank_hash_cmp_unlock( fd_bank_hash_cmp_t * bank_hash_cmp ); 79 : 80 : void 81 : fd_bank_hash_cmp_insert( fd_bank_hash_cmp_t * bank_hash_cmp, 82 : ulong slot, 83 : fd_hash_t const * hash, 84 : int ours, 85 : ulong stake ); 86 : 87 : /* Returns 1 on bank hash match (caller should move watermark forward), 88 : -1 on mismatch 89 : 0 if we weren't able to compare yet */ 90 : int 91 : fd_bank_hash_cmp_check( fd_bank_hash_cmp_t * bank_hash_cmp, ulong slot ); 92 : 93 : FD_PROTOTYPES_END 94 : 95 : #endif /* HEADER_fd_src_flamenco_runtime_fd_bank_hash_cmp_h */