LCOV - code coverage report
Current view: top level - util/wksp - fd_wksp_free_treap.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 193 193 100.0 %
Date: 2026-03-19 18:19:27 Functions: 3 3 100.0 %

          Line data    Source code
       1             : #include "fd_wksp_private.h"
       2             : 
       3             : ulong
       4             : fd_wksp_private_free_treap_query( ulong                     sz,
       5             :                                   fd_wksp_t *               wksp,
       6       25127 :                                   fd_wksp_private_pinfo_t * pinfo ) {
       7       25127 :   if( FD_UNLIKELY( !sz ) ) return FD_WKSP_PRIVATE_PINFO_IDX_NULL;
       8             : 
       9       25127 :   ulong f = FD_WKSP_PRIVATE_PINFO_IDX_NULL;
      10             : 
      11       25127 :   ulong part_max  = wksp->part_max;
      12       25127 :   ulong cycle_tag = wksp->cycle_tag++;
      13             : 
      14       25127 :   ulong i = fd_wksp_private_pinfo_idx( wksp->part_free_cidx );
      15       98008 :   while( !fd_wksp_private_pinfo_idx_is_null( i ) ) {
      16       79203 :     if( FD_UNLIKELY( i>=part_max                     ) ) return FD_WKSP_PRIVATE_PINFO_IDX_NULL; /* Bad index */
      17       79203 :     if( FD_UNLIKELY( pinfo[ i ].cycle_tag==cycle_tag ) ) return FD_WKSP_PRIVATE_PINFO_IDX_NULL; /* Cycle detected */
      18       79203 :     pinfo[ i ].cycle_tag = cycle_tag;                                                           /* Mark i as visited */
      19             : 
      20       79203 :     ulong part_sz = fd_wksp_private_pinfo_sz( pinfo + i );
      21       79203 :     if( sz>part_sz ) i = fd_wksp_private_pinfo_idx( pinfo[ i ].right_cidx ); /* Partition list and left too small, go right */
      22       34492 :     else {
      23       34492 :       f = i; /* If all else fails, partitions of this sz will work */
      24       34492 :       if( sz==part_sz ) break; /* Exact match (we aren't going to find anything better to our left) */
      25       28170 :       i = fd_wksp_private_pinfo_idx( pinfo[ i ].left_cidx );
      26       28170 :     }
      27       79203 :   }
      28             : 
      29       25127 :   return f;
      30       25127 : }
      31             : 
      32      999771 : #define TEST(c) do { if( FD_UNLIKELY( !(c) ) ) { /*FD_LOG_WARNING(( "FAIL: %s", #c ));*/ return FD_WKSP_ERR_CORRUPT; } } while(0)
      33             : 
      34      467515 : #define TEST_AND_MARK( i ) do {                                                                              \
      35      467515 :     ulong _i = (i);                                                                                          \
      36      467515 :     TEST( fd_wksp_private_pinfo_idx_is_null( _i ) | ((_i<part_max) && (pinfo[ _i ].cycle_tag!=cycle_tag)) ); \
      37      467515 :     if( !fd_wksp_private_pinfo_idx_is_null( _i ) ) pinfo[ _i ].cycle_tag = cycle_tag;                        \
      38      467515 :   } while(0)
      39             : 
      40      421157 : #define TEST_PARENT( i, p ) do {                                                       \
      41      421157 :     ulong _i = (i);                                                                    \
      42      421157 :     if( _i<part_max ) TEST( fd_wksp_private_pinfo_idx( pinfo[_i].parent_cidx )==(p) ); \
      43      421157 :   } while(0)
      44             : 
      45             : int
      46             : fd_wksp_private_free_treap_insert( ulong                     n,
      47             :                                    fd_wksp_t *               wksp,
      48       43910 :                                    fd_wksp_private_pinfo_t * pinfo ) {
      49             : 
      50       43910 :   ulong part_max  = wksp->part_max;
      51       43910 :   ulong cycle_tag = wksp->cycle_tag++;
      52             : 
      53       43910 :   TEST( n<part_max );               /* Make sure valid n */
      54       43910 :   pinfo[ n ].cycle_tag = cycle_tag; /* Mark n */
      55             : 
      56       43910 :   ulong g0 = pinfo[ n ].gaddr_lo;
      57       43910 :   ulong g1 = pinfo[ n ].gaddr_hi;
      58       43910 :   ulong n_sz = g1 - g0;
      59             : 
      60       43910 :   TEST( (wksp->gaddr_lo<=g0) & (g0<g1) & (g1<=wksp->gaddr_hi) ); /* Make sure valid range */
      61             : 
      62             :   /* Note: non-zero tag is okay temporarily.  We assume the caller
      63             :      will set the tag to non-zero immediately afterward to make the
      64             :      allocation "official". */
      65             : 
      66       43910 :   uint * _p_child_cidx = &wksp->part_free_cidx;
      67             : 
      68       43910 :   ulong i = fd_wksp_private_pinfo_idx( *_p_child_cidx ); TEST_AND_MARK( i );
      69             : 
      70             :   /* If an empty treap, make n the root and we are done */
      71             : 
      72       43910 :   if( FD_UNLIKELY( fd_wksp_private_pinfo_idx_is_null( i ) ) ) { /* Assume lots of free partitions typically */
      73           3 :     pinfo[ n ].in_same     = 0U;
      74           3 :     pinfo[ n ].left_cidx   = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
      75           3 :     pinfo[ n ].right_cidx  = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
      76           3 :     pinfo[ n ].same_cidx   = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
      77           3 :     pinfo[ n ].parent_cidx = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
      78           3 :     *_p_child_cidx = fd_wksp_private_pinfo_cidx( n );
      79           3 :     return FD_WKSP_SUCCESS;
      80           3 :   }
      81             : 
      82       43907 :   TEST_PARENT( i, FD_WKSP_PRIVATE_PINFO_IDX_NULL ); /* Make sure good parent link */
      83             : 
      84             :   /* Find the leaf node where we can insert n */
      85             : 
      86             :   /* TODO: Consider pushing path down onto stack and bubble up
      87             :      using the stack? */
      88             : 
      89      120221 :   for(;;) {
      90             : 
      91      120221 :     TEST( !pinfo[ i ].in_same );
      92             : 
      93             :     /* At this point, i is a valid marked index with good parent
      94             :        connectivity.  TODO: Consider validating ranges of visited nodes
      95             :        and tags of visited nodes */
      96             : 
      97             :     /* We need to validate both left and right child links to make the
      98             :        bubble up phase robust (because we do that after we actually have
      99             :        inserted). */
     100             : 
     101      120221 :     ulong l = fd_wksp_private_pinfo_idx( pinfo[ i ].left_cidx  ); TEST_AND_MARK( l ); TEST_PARENT( l, i );
     102      120221 :     ulong r = fd_wksp_private_pinfo_idx( pinfo[ i ].right_cidx ); TEST_AND_MARK( r ); TEST_PARENT( r, i );
     103             : 
     104      120221 :     ulong i_sz = fd_wksp_private_pinfo_sz( pinfo + i );
     105             : 
     106      120221 :     int go_left = (n_sz < i_sz);
     107      120221 :     if( go_left ) {
     108       30582 :       _p_child_cidx = &pinfo[ i ].left_cidx;
     109       30582 :       if( fd_wksp_private_pinfo_idx_is_null( l ) ) break;
     110       24778 :       i = l;
     111       24778 :       continue;
     112       30582 :     }
     113             : 
     114       89639 :     int go_right = (n_sz > i_sz);
     115       89639 :     if( go_right ) {
     116       85460 :       _p_child_cidx = &pinfo[ i ].right_cidx;
     117       85460 :       if( fd_wksp_private_pinfo_idx_is_null( r ) ) break;
     118       51536 :       i = r;
     119       51536 :       continue;
     120       85460 :     }
     121             : 
     122             :     /* n and i have the same size.  Insert into i's same list */
     123             : 
     124        4179 : #   if 1 /* This doesn't validate whether or not n is already in same list.  But it is O(1). */
     125             : 
     126        4179 :     ulong j = fd_wksp_private_pinfo_idx( pinfo[ i ].same_cidx ); TEST_AND_MARK( j );
     127             : 
     128        4179 :     pinfo[ n ].in_same     = 1U;
     129        4179 :     pinfo[ n ].left_cidx   = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
     130        4179 :     pinfo[ n ].right_cidx  = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
     131        4179 :     pinfo[ n ].same_cidx   = fd_wksp_private_pinfo_cidx( j );
     132        4179 :     pinfo[ n ].parent_cidx = fd_wksp_private_pinfo_cidx( i );
     133             : 
     134             :     /**/                                          pinfo[ i ].same_cidx   = fd_wksp_private_pinfo_cidx( n );
     135        4179 :     if( !fd_wksp_private_pinfo_idx_is_null( j ) ) pinfo[ j ].parent_cidx = fd_wksp_private_pinfo_cidx( n );
     136             : 
     137             : #   else /* This does but it is O(same_list_length). */
     138             : 
     139             :     ulong j = i;
     140             :     for(;;) {
     141             :       ulong k = fd_wksp_private_pinfo_idx( pinfo[ j ].same_cidx ); TEST_AND_MARK( k );
     142             :       if( fd_wksp_private_pinfo_idx_is_null( k ) ) break;
     143             :       TEST( fd_wksp_private_pinfo_idx( pinfo[ k ].parent_cidx )==j ); /* Make sure good prev */
     144             :       j = k;
     145             :     }
     146             : 
     147             :     pinfo[ n ].in_same     = 1U;
     148             :     pinfo[ n ].left_cidx   = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
     149             :     pinfo[ n ].right_cidx  = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
     150             :     pinfo[ n ].same_cidx   = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
     151             :     pinfo[ n ].parent_cidx = fd_wksp_private_pinfo_cidx( j );
     152             : 
     153             :     pinfo[ j ].same_cidx = fd_wksp_private_pinfo_cidx( n );
     154             : 
     155             : #   endif
     156             : 
     157        4179 :     return FD_WKSP_SUCCESS;
     158        4179 :   }
     159             : 
     160             :   /* Make n the appropriate child of i.  This might momentarily break
     161             :      the heap property. */
     162             : 
     163       39728 :   pinfo[ n ].in_same     = 0U;
     164       39728 :   pinfo[ n ].left_cidx   = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
     165       39728 :   pinfo[ n ].right_cidx  = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
     166       39728 :   pinfo[ n ].same_cidx   = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
     167       39728 :   pinfo[ n ].parent_cidx = fd_wksp_private_pinfo_cidx( i );
     168       39728 :   *_p_child_cidx         = fd_wksp_private_pinfo_cidx( n );
     169             : 
     170             :   /* Bubble n up until the heap property is restored.  Note that in the
     171             :      traversal above, we also validated parent links for this traversal
     172             :      (so that we could insert without worrying about encountering
     173             :      unpleasantness after we changed the treap). */
     174             : 
     175       89355 :   while( !fd_wksp_private_pinfo_idx_is_null( i ) ) {
     176       85460 :     uint n_prio = pinfo[ n ].heap_prio;
     177       85460 :     uint i_prio = pinfo[ i ].heap_prio;
     178       85460 :     int heap_intact = (n_prio < i_prio) | ((n_prio==i_prio) & (!((n ^ i) & 1UL))); /* Flip coin on equal priority */
     179       85460 :     if( heap_intact ) break;
     180             : 
     181       49627 :     ulong nl = fd_wksp_private_pinfo_idx( pinfo[ n ].left_cidx   ); /* Validated above */
     182       49627 :     ulong nr = fd_wksp_private_pinfo_idx( pinfo[ n ].right_cidx  ); /* Validated above */
     183       49627 :     ulong il = fd_wksp_private_pinfo_idx( pinfo[ i ].left_cidx   ); /* Validated above */
     184             :   //ulong ir = fd_wksp_private_pinfo_idx( pinfo[ i ].right_cidx  ); /* Validated above */
     185       49627 :     ulong p  = fd_wksp_private_pinfo_idx( pinfo[ i ].parent_cidx ); /* Validated above */
     186       49627 :     _p_child_cidx = fd_wksp_private_pinfo_idx_is_null( p )                 ? &wksp->part_free_cidx
     187       49627 :                   : (fd_wksp_private_pinfo_idx( pinfo[ p ].left_cidx )==i) ? &pinfo[ p ].left_cidx   /* Validated above */
     188       45732 :                   :                                                          &pinfo[ p ].right_cidx;
     189             : 
     190       49627 :     int left_child = (il==n);
     191       49627 :     if( left_child ) { /* 50/50 unpredictable */
     192             : 
     193       12691 :       pinfo[ n ].right_cidx  = fd_wksp_private_pinfo_cidx( i  ); pinfo[ i ].parent_cidx = fd_wksp_private_pinfo_cidx( n  );
     194       12691 :       pinfo[ n ].parent_cidx = fd_wksp_private_pinfo_cidx( p  ); *_p_child_cidx         = fd_wksp_private_pinfo_cidx( n );
     195             : 
     196       12691 :       pinfo[ i ].left_cidx = fd_wksp_private_pinfo_cidx( nr );
     197       12691 :       if( !fd_wksp_private_pinfo_idx_is_null( nr ) ) pinfo[ nr ].parent_cidx = fd_wksp_private_pinfo_cidx( i );
     198             : 
     199       36936 :     } else {
     200             : 
     201       36936 :       pinfo[ n ].left_cidx   = fd_wksp_private_pinfo_cidx( i  ); pinfo[ i  ].parent_cidx = fd_wksp_private_pinfo_cidx( n );
     202       36936 :       pinfo[ n ].parent_cidx = fd_wksp_private_pinfo_cidx( p  ); *_p_child_cidx          = fd_wksp_private_pinfo_cidx( n );
     203             : 
     204       36936 :       pinfo[ i ].right_cidx = fd_wksp_private_pinfo_cidx( nl );
     205       36936 :       if( !fd_wksp_private_pinfo_idx_is_null( nl ) ) pinfo[ nl ].parent_cidx = fd_wksp_private_pinfo_cidx( i );
     206             : 
     207       36936 :     }
     208             : 
     209       49627 :     i = p;
     210       49627 :   }
     211             : 
     212       39728 :   return FD_WKSP_SUCCESS;
     213       43907 : }
     214             : 
     215             : int
     216             : fd_wksp_private_free_treap_remove( ulong                     d,
     217             :                                    fd_wksp_t *               wksp,
     218       42176 :                                    fd_wksp_private_pinfo_t * pinfo ) {
     219             : 
     220       42176 :   ulong part_max  = wksp->part_max;
     221       42176 :   ulong cycle_tag = wksp->cycle_tag++;
     222             : 
     223       42176 :   TEST( d<part_max );
     224       42176 :   pinfo[ d ].cycle_tag = cycle_tag; /* Mark d */
     225             : 
     226             :   /* If d is in a same list, remove it */
     227             : 
     228       42176 :   ulong j = fd_wksp_private_pinfo_idx( pinfo[ d ].same_cidx ); TEST_AND_MARK( j ); TEST_PARENT( j, d );
     229             : 
     230       42176 :   if( pinfo[ d ].in_same ) {
     231        1444 :     ulong i = fd_wksp_private_pinfo_idx( pinfo[ d ].parent_cidx ); TEST_AND_MARK( i );
     232             : 
     233        1444 :     TEST( !fd_wksp_private_pinfo_idx_is_null( i ) );
     234        1444 :     TEST( pinfo[ i ].same_cidx==d );
     235             : 
     236        1444 :     if( !fd_wksp_private_pinfo_idx_is_null( j ) ) pinfo[ j ].parent_cidx = fd_wksp_private_pinfo_cidx( i );
     237        1444 :     pinfo[ i ].same_cidx = fd_wksp_private_pinfo_cidx( j );
     238        1444 :     goto done;
     239        1444 :   }
     240             : 
     241             :   /* d is not in a same list.  Load and validate the environment
     242             :      surrounding d. */
     243             : 
     244       40732 :   ulong l = fd_wksp_private_pinfo_idx( pinfo[ d ].left_cidx   ); TEST_AND_MARK( l ); TEST_PARENT( l, d );
     245       40732 :   ulong r = fd_wksp_private_pinfo_idx( pinfo[ d ].right_cidx  ); TEST_AND_MARK( r ); TEST_PARENT( r, d );
     246       40732 :   ulong p = fd_wksp_private_pinfo_idx( pinfo[ d ].parent_cidx ); TEST_AND_MARK( p );
     247             : 
     248       40732 :   uint * _p_child_cidx;
     249       40732 :   if( fd_wksp_private_pinfo_idx_is_null( p ) ) {
     250        3997 :     _p_child_cidx = &wksp->part_free_cidx;
     251        3997 :     TEST( (*_p_child_cidx)==d );
     252       36735 :   } else {
     253       36735 :     ulong pl = fd_wksp_private_pinfo_idx( pinfo[ p ].left_cidx  ); /* One should be marked from above */
     254       36735 :     ulong pr = fd_wksp_private_pinfo_idx( pinfo[ p ].right_cidx ); /* The other should not. */
     255       36735 :     int is_left_child  = (pl==d);
     256       36735 :     int is_right_child = (pr==d);
     257       36735 :     TEST( is_left_child!=is_right_child );
     258       36735 :     _p_child_cidx = fd_ptr_if( is_left_child, &pinfo[ p ].left_cidx, &pinfo[ p ].right_cidx );
     259       36735 :   }
     260             : 
     261             :   /* If d has non-empty same list, fill the hole made by removing d with
     262             :      the first partition in d's same list.  This might break the heap
     263             :      property.  Instead of doing a bunch of bubbling, since d already
     264             :      had a valid heap priority, we just swap the heap priorities of j
     265             :      with the heap priority of d. */
     266             : 
     267       40732 :   if( !fd_wksp_private_pinfo_idx_is_null( j ) ) {
     268        1005 :     pinfo[ j ].in_same     = 0U;
     269        1005 :     pinfo[ j ].left_cidx   = fd_wksp_private_pinfo_cidx( l );
     270        1005 :     pinfo[ j ].right_cidx  = fd_wksp_private_pinfo_cidx( r );
     271        1005 :     pinfo[ j ].parent_cidx = fd_wksp_private_pinfo_cidx( p );
     272             :   //pinfo[ j ].same_cidx unchanged
     273             : 
     274        1005 :     uint j_prio = pinfo[ j ].heap_prio;
     275        1005 :     uint d_prio = pinfo[ d ].heap_prio;
     276        1005 :     pinfo[ j ].heap_prio = d_prio & ((1UL<<31)-1UL); /* Quell dubious compiler warning */
     277        1005 :     pinfo[ d ].heap_prio = j_prio & ((1UL<<31)-1UL); /* " */
     278             : 
     279        1005 :     if( !fd_wksp_private_pinfo_idx_is_null( l ) ) pinfo[ l ].parent_cidx = fd_wksp_private_pinfo_cidx( j );
     280        1005 :     if( !fd_wksp_private_pinfo_idx_is_null( r ) ) pinfo[ r ].parent_cidx = fd_wksp_private_pinfo_cidx( j );
     281        1005 :     *_p_child_cidx = fd_wksp_private_pinfo_cidx( j );
     282             : 
     283        1005 :     goto done;
     284        1005 :   }
     285             : 
     286       52895 :   for(;;) {
     287             : 
     288             :     /* At this point, d is the only partition of its size and we have a
     289             :        non-trivial hole to fill.
     290             : 
     291             :        i and j are IDX_NULL as d has no same sized partitions
     292             :        l is the hole's left subtree (if any), validated and marked
     293             :        r is the hole's right subtree (if any), validated and marked
     294             :        p is the hole's parent (if any), if non-NULL, validated and marked
     295             : 
     296             :        _p_child_cidx is the location of link from the parent to the hole
     297             :        (or the pointer to the tree root if d is the root), validated. */
     298             : 
     299             :     /* If the hole has no left subtree (and maybe no right subtree and
     300             :        maybe no parent), fill the hole with the right subtree (or with
     301             :        nothing if no right subtree) and we are done. */
     302             : 
     303       52895 :     if( fd_wksp_private_pinfo_idx_is_null( l ) ) {
     304        8959 :       if( !fd_wksp_private_pinfo_idx_is_null( r ) ) pinfo[ r ].parent_cidx = fd_wksp_private_pinfo_cidx( p );
     305        8959 :       *_p_child_cidx = fd_wksp_private_pinfo_cidx( r );
     306        8959 :       break;
     307        8959 :     }
     308             : 
     309             :     /* If the hole has no right subtree but has a left subtree (and
     310             :        maybe no parent), fill the hole with the left subtree and we are
     311             :        done. */
     312             : 
     313       43936 :     if( fd_wksp_private_pinfo_idx_is_null( r ) ) {
     314       30768 :       pinfo[ l ].parent_cidx = fd_wksp_private_pinfo_cidx( p );
     315       30768 :       *_p_child_cidx = fd_wksp_private_pinfo_cidx( l );
     316       30768 :       break;
     317       30768 :     }
     318             : 
     319             :     /* At this point, we have to push the hole down the left or right
     320             :        subtree (and we still maybe have no parent).  We use the heap
     321             :        priorities to decide such that we preserve the heap property (we
     322             :        flip a coin on equal priorities).  We ultimately can omit any
     323             :        link updates involving d as these will be replaced with correct
     324             :        links before this returns. */
     325             : 
     326       13168 :     uint l_prio = pinfo[ l ].heap_prio;
     327       13168 :     uint r_prio = pinfo[ r ].heap_prio;
     328             : 
     329       13168 :     int promote_left = (l_prio>r_prio) | ((l_prio==r_prio) & (!((p ^ d) & 1UL)));
     330       13168 :     if( promote_left ) {
     331             : 
     332        3925 :       ulong t = fd_wksp_private_pinfo_idx( pinfo[ l ].right_cidx ); TEST_AND_MARK( t ); TEST_PARENT( t, l );
     333             : 
     334        3925 :       *_p_child_cidx        = fd_wksp_private_pinfo_cidx( l ); pinfo[ l ].parent_cidx = fd_wksp_private_pinfo_cidx( p );
     335             :     //pinfo[ l ].right_cidx = fd_wksp_private_pinfo_cidx( d ); pinfo[ d ].parent_cidx = fd_wksp_private_pinfo_cidx( l );
     336             :     //pinfo[ d ].left_cidx  = fd_wksp_private_pinfo_cidx( t );
     337             :     //if( !fd_wksp_private_pinfo_idx_is_null( t ) ) pinfo[ t ].parent_cidx = fd_wksp_private_pinfo_cidx( d );
     338             : 
     339        3925 :       _p_child_cidx = &pinfo[ l ].right_cidx; /* TBD next iteration */
     340             : 
     341        3925 :       p = l;
     342        3925 :       l = t;
     343             : 
     344        9243 :     } else { /* This is the mirror image of the above */
     345             : 
     346        9243 :       ulong t = fd_wksp_private_pinfo_idx( pinfo[ r ].left_cidx ); TEST_AND_MARK( t ); TEST_PARENT( t, r );
     347             : 
     348        9243 :       *_p_child_cidx        = fd_wksp_private_pinfo_cidx( r ); pinfo[ r ].parent_cidx = fd_wksp_private_pinfo_cidx( p );
     349             :     //pinfo[ r ].left_cidx  = fd_wksp_private_pinfo_cidx( d ); pinfo[ d ].parent_cidx = fd_wksp_private_pinfo_cidx( r );
     350             :     //pinfo[ d ].right_cidx = fd_wksp_private_pinfo_cidx( t );
     351             :     //if( !fd_wksp_private_pinfo_idx_is_null( t ) ) pinfo[ t ].parent_cidx = fd_wksp_private_pinfo_cidx( d );
     352             : 
     353        9243 :       _p_child_cidx = &pinfo[ r ].left_cidx; /* TBD next iteration */
     354             : 
     355        9243 :       p = r;
     356        9243 :       r = t;
     357             : 
     358        9243 :     }
     359             : 
     360       13168 :   }
     361             : 
     362       42176 : done:
     363       42176 :   pinfo[ d ].in_same     = 0U;
     364       42176 :   pinfo[ d ].left_cidx   = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
     365       42176 :   pinfo[ d ].right_cidx  = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
     366       42176 :   pinfo[ d ].same_cidx   = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
     367       42176 :   pinfo[ d ].parent_cidx = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
     368       42176 :   return FD_WKSP_SUCCESS;
     369       39727 : }
     370             : 
     371             : #undef TEST_PARENT
     372             : #undef TEST_AND_MARK
     373             : #undef TEST

Generated by: LCOV version 1.14