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: 2025-01-08 12:08:44 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   149047506 : FD_FN_PURE static inline int txn_is_frozen( txn_t * txn ) { return !!txn->child_head; }
      59             : 
      60    98306499 : 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    27399642 : txn_ancestor( txn_t * txn ) {
      64    36634314 :   for(;;) {
      65    36634314 :     if( !txn_is_only_child( txn ) ) break;
      66    10288377 :     if( !txn->parent ) return NULL;
      67     9234672 :     txn = txn->parent;
      68     9234672 :   }
      69    26345937 :   return txn;
      70    27399642 : }
      71             : 
      72             : FD_FN_PURE static inline txn_t *
      73    30318915 : txn_descendant( txn_t * txn ) {
      74    30318915 :   if( !txn_is_only_child( txn ) ) return NULL;
      75    11342082 :   for(;;) {
      76    11342082 :     if( !txn->child_head || !txn_is_only_child( txn->child_head ) ) break;
      77     2613423 :     txn = txn->child_head;
      78     2613423 :   }
      79     8728659 :   return txn;
      80    30318915 : }
      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             : /*
      97             : void
      98             : txn_merge( funk_t * funk,
      99             :            txn_t *  txn );
     100             : */
     101             : 
     102             : static inline txn_t *
     103             : txn_cancel_children( funk_t * funk,
     104      275229 :                      txn_t *  txn ) {
     105      275229 :   txn_t * child = txn ? txn->child_head : funk->child_head;
     106      444912 :   while( child ) {
     107      169683 :     txn_t * next = child->sibling_next;
     108      169683 :     txn_cancel( funk, child );
     109      169683 :     child = next;
     110      169683 :   }
     111      275229 :   return txn;
     112      275229 : }
     113             : 
     114             : static inline txn_t *
     115             : txn_cancel_siblings( funk_t * funk,
     116       67746 :                      txn_t *  txn ) {
     117       67746 :   txn_t * child = txn->parent ? txn->parent->child_head : funk->child_head;
     118      230256 :   while( child ) {
     119      162510 :     txn_t * next = child->sibling_next;
     120      162510 :     if( child!=txn ) txn_cancel( funk, child );
     121      162510 :     child = next;
     122      162510 :   }
     123       67746 :   return txn;
     124       67746 : }
     125             : 
     126             : /* Mini rec API */
     127             : 
     128             : FD_FN_PURE rec_t *
     129             : rec_query( funk_t * funk,
     130             :            txn_t *  txn,
     131             :            ulong    key );
     132             : 
     133             : FD_FN_PURE rec_t *
     134             : rec_query_global( funk_t * funk,
     135             :                   txn_t *  txn,
     136             :                   ulong    key );
     137             : 
     138             : rec_t *
     139             : rec_insert( funk_t * funk,
     140             :             txn_t *  txn,
     141             :             ulong    key );
     142             : 
     143             : void
     144             : rec_remove( funk_t * funk,
     145             :             rec_t *  rec );
     146             : 
     147             : /* Mini funk API */
     148             : 
     149             : funk_t *
     150             : funk_new( void );
     151             : 
     152             : void
     153             : funk_delete( funk_t * funk );
     154             : 
     155   218265429 : static inline int funk_is_frozen( funk_t * funk ) { return !!funk->child_head; }
     156             : 
     157             : FD_FN_PURE static inline txn_t *
     158     3145728 : funk_descendant( funk_t * funk ) {
     159     3145728 :   return funk->child_head ? txn_descendant( funk->child_head ) : NULL;
     160     3145728 : }
     161             : 
     162             : /* Testing utilities */
     163             : 
     164             : ulong
     165             : xid_unique( void );
     166             : 
     167             : static inline fd_funk_txn_xid_t *
     168             : xid_set( fd_funk_txn_xid_t * xid,
     169  2237406849 :          ulong               _xid ) {
     170  2237406849 :   xid->ul[0] = _xid; xid->ul[1] = _xid+_xid;
     171  2237406849 :   return xid;
     172  2237406849 : }
     173             : 
     174             : FD_FN_PURE static inline int
     175             : xid_eq( fd_funk_txn_xid_t const * xid,
     176  1606454226 :          ulong                    _xid ) {
     177  1606454226 :   fd_funk_txn_xid_t tmp[1];
     178  1606454226 :   return fd_funk_txn_xid_eq( xid, xid_set( tmp, _xid ) );
     179  1606454226 : }
     180             : 
     181             : static inline fd_funk_rec_key_t *
     182             : key_set( fd_funk_rec_key_t * key,
     183  1439918337 :          ulong               _key ) {
     184  1439918337 :   key->ul[0] = _key; key->ul[1] = _key+_key; key->ul[2] = _key*_key; key->ul[3] = -_key;
     185  1439918337 :   key->ul[4] = _key*3U;
     186  1439918337 :   return key;
     187  1439918337 : }
     188             : 
     189             : FD_FN_PURE int
     190             : key_eq( fd_funk_rec_key_t const * key,
     191             :         ulong                     _key );
     192             : 
     193             : FD_PROTOTYPES_END
     194             : 
     195             : #endif /* HEADER_fd_src_funk_test_funk_common_h */

Generated by: LCOV version 1.14