LCOV - code coverage report
Current view: top level - funk - test_funk_common.h (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 53 53 100.0 %
Date: 2024-11-13 11:58:15 Functions: 16 33 48.5 %

          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 */

Generated by: LCOV version 1.14