Line data Source code
1 : #ifndef HEADER_fd_src_funk_test_funk_common_h 2 : #define HEADER_fd_src_funk_test_funk_common_h 3 : 4 : /* "Mini-funk" implementation for reference and testing purposes */ 5 : 6 : #include "fd_funk_base.h" 7 : 8 : struct txn; 9 : typedef struct txn txn_t; 10 : 11 : struct rec; 12 : typedef struct rec rec_t; 13 : 14 : struct rec { 15 : txn_t * txn; 16 : ulong key; 17 : rec_t * prev; 18 : rec_t * next; 19 : rec_t * map_prev; 20 : rec_t * map_next; 21 : int erase; 22 : uint val; 23 : }; 24 : 25 : struct txn { 26 : ulong xid; 27 : txn_t * parent; 28 : txn_t * child_head; 29 : txn_t * child_tail; 30 : txn_t * sibling_prev; 31 : txn_t * sibling_next; 32 : txn_t * map_prev; 33 : txn_t * map_next; 34 : rec_t * rec_head; 35 : rec_t * rec_tail; 36 : }; 37 : 38 : struct funk { 39 : ulong last_publish; 40 : txn_t * child_head; 41 : txn_t * child_tail; 42 : txn_t * txn_map_head; 43 : txn_t * txn_map_tail; 44 : ulong txn_cnt; 45 : rec_t * rec_head; 46 : rec_t * rec_tail; 47 : rec_t * rec_map_head; 48 : rec_t * rec_map_tail; 49 : ulong rec_cnt; 50 : }; 51 : 52 : typedef struct funk funk_t; 53 : 54 : FD_PROTOTYPES_BEGIN 55 : 56 : /* Mini txn API */ 57 : 58 160339407 : FD_FN_PURE static inline int txn_is_frozen( txn_t * txn ) { return !!txn->child_head; } 59 : 60 164387844 : FD_FN_PURE static inline int txn_is_only_child( txn_t * txn ) { return !txn->sibling_prev && !txn->sibling_next; } 61 : 62 : FD_FN_PURE static inline txn_t * 63 46851759 : txn_ancestor( txn_t * txn ) { 64 62095626 : for(;;) { 65 62095626 : if( !txn_is_only_child( txn ) ) break; 66 15899613 : if( !txn->parent ) return NULL; 67 15243867 : txn = txn->parent; 68 15243867 : } 69 46196013 : return txn; 70 46851759 : } 71 : 72 : FD_FN_PURE static inline txn_t * 73 49892142 : txn_descendant( txn_t * txn ) { 74 49892142 : if( !txn_is_only_child( txn ) ) return NULL; 75 16555359 : for(;;) { 76 16555359 : if( !txn->child_head || !txn_is_only_child( txn->child_head ) ) break; 77 3529692 : txn = txn->child_head; 78 3529692 : } 79 13025667 : return txn; 80 49892142 : } 81 : 82 : txn_t * 83 : txn_prepare( funk_t * funk, 84 : txn_t * parent, 85 : ulong xid ); 86 : 87 : void 88 : txn_cancel( funk_t * funk, 89 : txn_t * txn ); 90 : 91 : ulong 92 : txn_publish( funk_t * funk, 93 : txn_t * txn, 94 : ulong cnt ); 95 : 96 : void 97 : txn_merge( funk_t * funk, 98 : txn_t * txn ); 99 : 100 : static inline txn_t * 101 : txn_cancel_children( funk_t * funk, 102 265500 : txn_t * txn ) { 103 265500 : txn_t * child = txn ? txn->child_head : funk->child_head; 104 439035 : while( child ) { 105 173535 : txn_t * next = child->sibling_next; 106 173535 : txn_cancel( funk, child ); 107 173535 : child = next; 108 173535 : } 109 265500 : return txn; 110 265500 : } 111 : 112 : static inline txn_t * 113 : txn_cancel_siblings( funk_t * funk, 114 51189 : txn_t * txn ) { 115 51189 : txn_t * child = txn->parent ? txn->parent->child_head : funk->child_head; 116 183375 : while( child ) { 117 132186 : txn_t * next = child->sibling_next; 118 132186 : if( child!=txn ) txn_cancel( funk, child ); 119 132186 : child = next; 120 132186 : } 121 51189 : return txn; 122 51189 : } 123 : 124 : /* Mini rec API */ 125 : 126 : FD_FN_PURE rec_t * 127 : rec_query( funk_t * funk, 128 : txn_t * txn, 129 : ulong key ); 130 : 131 : FD_FN_PURE rec_t * 132 : rec_query_global( funk_t * funk, 133 : txn_t * txn, 134 : ulong key ); 135 : 136 : rec_t * 137 : rec_insert( funk_t * funk, 138 : txn_t * txn, 139 : ulong key ); 140 : 141 : void 142 : rec_remove( funk_t * funk, 143 : rec_t * rec, 144 : int erase ); 145 : 146 : /* Mini funk API */ 147 : 148 : funk_t * 149 : funk_new( void ); 150 : 151 : void 152 : funk_delete( funk_t * funk ); 153 : 154 119108337 : static inline int funk_is_frozen( funk_t * funk ) { return !!funk->child_head; } 155 : 156 : FD_FN_PURE static inline txn_t * 157 3145728 : funk_descendant( funk_t * funk ) { 158 3145728 : return funk->child_head ? txn_descendant( funk->child_head ) : NULL; 159 3145728 : } 160 : 161 : /* Testing utilities */ 162 : 163 : ulong 164 : xid_unique( void ); 165 : 166 : static inline fd_funk_txn_xid_t * 167 : xid_set( fd_funk_txn_xid_t * xid, 168 1865010768 : ulong _xid ) { 169 1865010768 : xid->ul[0] = _xid; xid->ul[1] = _xid+_xid; 170 1865010768 : return xid; 171 1865010768 : } 172 : 173 : FD_FN_PURE static inline int 174 : xid_eq( fd_funk_txn_xid_t const * xid, 175 1398429318 : ulong _xid ) { 176 1398429318 : fd_funk_txn_xid_t tmp[1]; 177 1398429318 : return fd_funk_txn_xid_eq( xid, xid_set( tmp, _xid ) ); 178 1398429318 : } 179 : 180 : static inline fd_funk_rec_key_t * 181 : key_set( fd_funk_rec_key_t * key, 182 1048643676 : ulong _key ) { 183 1048643676 : key->ul[0] = _key; key->ul[1] = _key+_key; key->ul[2] = _key*_key; key->ul[3] = -_key; 184 1048643676 : key->ul[4] = _key*3U; 185 1048643676 : return key; 186 1048643676 : } 187 : 188 : FD_FN_PURE int 189 : key_eq( fd_funk_rec_key_t const * key, 190 : ulong _key ); 191 : 192 : FD_PROTOTYPES_END 193 : 194 : #endif /* HEADER_fd_src_funk_test_funk_common_h */