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-09-17 04:28:31 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    45200142 :                                   fd_wksp_private_pinfo_t * pinfo ) {
       7    45200142 :   if( FD_UNLIKELY( !sz ) ) return FD_WKSP_PRIVATE_PINFO_IDX_NULL;
       8             : 
       9    44753601 :   ulong f = FD_WKSP_PRIVATE_PINFO_IDX_NULL;
      10             : 
      11    44753601 :   ulong part_max  = wksp->part_max;
      12    44753601 :   ulong cycle_tag = wksp->cycle_tag++;
      13             : 
      14    44753601 :   ulong i = fd_wksp_private_pinfo_idx( wksp->part_free_cidx );
      15   271319590 :   while( !fd_wksp_private_pinfo_idx_is_null( i ) ) {
      16   241234210 :     if( FD_UNLIKELY( i>=part_max                     ) ) return FD_WKSP_PRIVATE_PINFO_IDX_NULL; /* Bad index */
      17   241234210 :     if( FD_UNLIKELY( pinfo[ i ].cycle_tag==cycle_tag ) ) return FD_WKSP_PRIVATE_PINFO_IDX_NULL; /* Cycle detected */
      18   241234210 :     pinfo[ i ].cycle_tag = cycle_tag;                                                           /* Mark i as visited */
      19             : 
      20   241234210 :     ulong part_sz = fd_wksp_private_pinfo_sz( pinfo + i );
      21   241234210 :     if( sz>part_sz ) i = fd_wksp_private_pinfo_idx( pinfo[ i ].right_cidx ); /* Partition list and left too small, go right */
      22   122879421 :     else {
      23   122879421 :       f = i; /* If all else fails, partitions of this sz will work */
      24   122879421 :       if( sz==part_sz ) break; /* Exact match (we aren't going to find anything better to our left) */
      25   108211200 :       i = fd_wksp_private_pinfo_idx( pinfo[ i ].left_cidx );
      26   108211200 :     }
      27   241234210 :   }
      28             : 
      29    44753601 :   return f;
      30    44753601 : }
      31             : 
      32  1528928093 : #define TEST(c) do { if( FD_UNLIKELY( !(c) ) ) { /*FD_LOG_WARNING(( "FAIL: %s", #c ));*/ return FD_WKSP_ERR_CORRUPT; } } while(0)
      33             : 
      34   694060902 : #define TEST_AND_MARK( i ) do {                                                                              \
      35   694060902 :     ulong _i = (i);                                                                                          \
      36   694060902 :     TEST( fd_wksp_private_pinfo_idx_is_null( _i ) | ((_i<part_max) && (pinfo[ _i ].cycle_tag!=cycle_tag)) ); \
      37   694060902 :     if( !fd_wksp_private_pinfo_idx_is_null( _i ) ) pinfo[ _i ].cycle_tag = cycle_tag;                        \
      38   690511587 :   } while(0)
      39             : 
      40   621185661 : #define TEST_PARENT( i, p ) do {                                                       \
      41   621185661 :     ulong _i = (i);                                                                    \
      42   621185661 :     if( _i<part_max ) TEST( fd_wksp_private_pinfo_idx( pinfo[_i].parent_cidx )==(p) ); \
      43   621185661 :   } while(0)
      44             : 
      45             : int
      46             : fd_wksp_private_free_treap_insert( ulong                     n,
      47             :                                    fd_wksp_t *               wksp,
      48    48155832 :                                    fd_wksp_private_pinfo_t * pinfo ) {
      49             : 
      50    48155832 :   ulong part_max  = wksp->part_max;
      51    48155832 :   ulong cycle_tag = wksp->cycle_tag++;
      52             : 
      53    48155832 :   TEST( n<part_max );               /* Make sure valid n */
      54    48155832 :   pinfo[ n ].cycle_tag = cycle_tag; /* Mark n */
      55             : 
      56    48155832 :   ulong g0 = pinfo[ n ].gaddr_lo;
      57    48155832 :   ulong g1 = pinfo[ n ].gaddr_hi;
      58    48155832 :   ulong n_sz = g1 - g0;
      59             : 
      60    48155832 :   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    48155832 :   uint * _p_child_cidx = &wksp->part_free_cidx;
      67             : 
      68    48155832 :   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    48036828 :   if( FD_UNLIKELY( fd_wksp_private_pinfo_idx_is_null( i ) ) ) { /* Assume lots of free partitions typically */
      73      701838 :     pinfo[ n ].in_same     = 0U;
      74      701838 :     pinfo[ n ].left_cidx   = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
      75      701838 :     pinfo[ n ].right_cidx  = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
      76      701838 :     pinfo[ n ].same_cidx   = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
      77      701838 :     pinfo[ n ].parent_cidx = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
      78      701838 :     *_p_child_cidx = fd_wksp_private_pinfo_cidx( n );
      79      701838 :     return FD_WKSP_SUCCESS;
      80      701838 :   }
      81             : 
      82    47334990 :   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   215034681 :   for(;;) {
      90             : 
      91   215034681 :     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   215034681 :     ulong l = fd_wksp_private_pinfo_idx( pinfo[ i ].left_cidx  ); TEST_AND_MARK( l ); TEST_PARENT( l, i );
     102   213228822 :     ulong r = fd_wksp_private_pinfo_idx( pinfo[ i ].right_cidx ); TEST_AND_MARK( r ); TEST_PARENT( r, i );
     103             : 
     104   211604370 :     ulong i_sz = fd_wksp_private_pinfo_sz( pinfo + i );
     105             : 
     106   211604370 :     int go_left = (n_sz < i_sz);
     107   211604370 :     if( go_left ) {
     108    94316581 :       _p_child_cidx = &pinfo[ i ].left_cidx;
     109    94316581 :       if( fd_wksp_private_pinfo_idx_is_null( l ) ) break;
     110    81645153 :       i = l;
     111    81645153 :       continue;
     112    94316581 :     }
     113             : 
     114   117287789 :     int go_right = (n_sz > i_sz);
     115   117287789 :     if( go_right ) {
     116   100049771 :       _p_child_cidx = &pinfo[ i ].right_cidx;
     117   100049771 :       if( fd_wksp_private_pinfo_idx_is_null( r ) ) break;
     118    86054538 :       i = r;
     119    86054538 :       continue;
     120   100049771 :     }
     121             : 
     122             :     /* n and i have the same size.  Insert into i's same list */
     123             : 
     124    17238018 : #   if 1 /* This doesn't validate whether or not n is already in same list.  But it is O(1). */
     125             : 
     126    17238018 :     ulong j = fd_wksp_private_pinfo_idx( pinfo[ i ].same_cidx ); TEST_AND_MARK( j );
     127             : 
     128    17238018 :     pinfo[ n ].in_same     = 1U;
     129    17238018 :     pinfo[ n ].left_cidx   = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
     130    17238018 :     pinfo[ n ].right_cidx  = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
     131    17238018 :     pinfo[ n ].same_cidx   = fd_wksp_private_pinfo_cidx( j );
     132    17238018 :     pinfo[ n ].parent_cidx = fd_wksp_private_pinfo_cidx( i );
     133             : 
     134             :     /**/                                          pinfo[ i ].same_cidx   = fd_wksp_private_pinfo_cidx( n );
     135    17238018 :     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    17238018 :     return FD_WKSP_SUCCESS;
     158    17238018 :   }
     159             : 
     160             :   /* Make n the appropriate child of i.  This might momentarily break
     161             :      the heap property. */
     162             : 
     163    26666661 :   pinfo[ n ].in_same     = 0U;
     164    26666661 :   pinfo[ n ].left_cidx   = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
     165    26666661 :   pinfo[ n ].right_cidx  = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
     166    26666661 :   pinfo[ n ].same_cidx   = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
     167    26666661 :   pinfo[ n ].parent_cidx = fd_wksp_private_pinfo_cidx( i );
     168    26666661 :   *_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    67316562 :   while( !fd_wksp_private_pinfo_idx_is_null( i ) ) {
     176    64815471 :     uint n_prio = pinfo[ n ].heap_prio;
     177    64815471 :     uint i_prio = pinfo[ i ].heap_prio;
     178    64815471 :     int heap_intact = (n_prio < i_prio) | ((n_prio==i_prio) & (!((n ^ i) & 1UL))); /* Flip coin on equal priority */
     179    64815471 :     if( heap_intact ) break;
     180             : 
     181    40649901 :     ulong nl = fd_wksp_private_pinfo_idx( pinfo[ n ].left_cidx   ); /* Validated above */
     182    40649901 :     ulong nr = fd_wksp_private_pinfo_idx( pinfo[ n ].right_cidx  ); /* Validated above */
     183    40649901 :     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    40649901 :     ulong p  = fd_wksp_private_pinfo_idx( pinfo[ i ].parent_cidx ); /* Validated above */
     186    40649901 :     _p_child_cidx = fd_wksp_private_pinfo_idx_is_null( p )                 ? &wksp->part_free_cidx
     187    40649901 :                   : (fd_wksp_private_pinfo_idx( pinfo[ p ].left_cidx )==i) ? &pinfo[ p ].left_cidx   /* Validated above */
     188    38148810 :                   :                                                          &pinfo[ p ].right_cidx;
     189             : 
     190    40649901 :     int left_child = (il==n);
     191    40649901 :     if( left_child ) { /* 50/50 unpredictable */
     192             : 
     193    18441423 :       pinfo[ n ].right_cidx  = fd_wksp_private_pinfo_cidx( i  ); pinfo[ i ].parent_cidx = fd_wksp_private_pinfo_cidx( n  );
     194    18441423 :       pinfo[ n ].parent_cidx = fd_wksp_private_pinfo_cidx( p  ); *_p_child_cidx         = fd_wksp_private_pinfo_cidx( n );
     195             : 
     196    18441423 :       pinfo[ i ].left_cidx = fd_wksp_private_pinfo_cidx( nr );
     197    18441423 :       if( !fd_wksp_private_pinfo_idx_is_null( nr ) ) pinfo[ nr ].parent_cidx = fd_wksp_private_pinfo_cidx( i );
     198             : 
     199    22208478 :     } else {
     200             : 
     201    22208478 :       pinfo[ n ].left_cidx   = fd_wksp_private_pinfo_cidx( i  ); pinfo[ i  ].parent_cidx = fd_wksp_private_pinfo_cidx( n );
     202    22208478 :       pinfo[ n ].parent_cidx = fd_wksp_private_pinfo_cidx( p  ); *_p_child_cidx          = fd_wksp_private_pinfo_cidx( n );
     203             : 
     204    22208478 :       pinfo[ i ].right_cidx = fd_wksp_private_pinfo_cidx( nl );
     205    22208478 :       if( !fd_wksp_private_pinfo_idx_is_null( nl ) ) pinfo[ nl ].parent_cidx = fd_wksp_private_pinfo_cidx( i );
     206             : 
     207    22208478 :     }
     208             : 
     209    40649901 :     i = p;
     210    40649901 :   }
     211             : 
     212    26666661 :   return FD_WKSP_SUCCESS;
     213    47334990 : }
     214             : 
     215             : int
     216             : fd_wksp_private_free_treap_remove( ulong                     d,
     217             :                                    fd_wksp_t *               wksp,
     218    51386070 :                                    fd_wksp_private_pinfo_t * pinfo ) {
     219             : 
     220    51386070 :   ulong part_max  = wksp->part_max;
     221    51386070 :   ulong cycle_tag = wksp->cycle_tag++;
     222             : 
     223    51386070 :   TEST( d<part_max );
     224    51386070 :   pinfo[ d ].cycle_tag = cycle_tag; /* Mark d */
     225             : 
     226             :   /* If d is in a same list, remove it */
     227             : 
     228    51386070 :   ulong j = fd_wksp_private_pinfo_idx( pinfo[ d ].same_cidx ); TEST_AND_MARK( j ); TEST_PARENT( j, d );
     229             : 
     230    51386070 :   if( pinfo[ d ].in_same ) {
     231    10942209 :     ulong i = fd_wksp_private_pinfo_idx( pinfo[ d ].parent_cidx ); TEST_AND_MARK( i );
     232             : 
     233    10942209 :     TEST( !fd_wksp_private_pinfo_idx_is_null( i ) );
     234    10942209 :     TEST( pinfo[ i ].same_cidx==d );
     235             : 
     236    10942209 :     if( !fd_wksp_private_pinfo_idx_is_null( j ) ) pinfo[ j ].parent_cidx = fd_wksp_private_pinfo_cidx( i );
     237    10942209 :     pinfo[ i ].same_cidx = fd_wksp_private_pinfo_cidx( j );
     238    10942209 :     goto done;
     239    10942209 :   }
     240             : 
     241             :   /* d is not in a same list.  Load and validate the environment
     242             :      surrounding d. */
     243             : 
     244    40443861 :   ulong l = fd_wksp_private_pinfo_idx( pinfo[ d ].left_cidx   ); TEST_AND_MARK( l ); TEST_PARENT( l, d );
     245    40443861 :   ulong r = fd_wksp_private_pinfo_idx( pinfo[ d ].right_cidx  ); TEST_AND_MARK( r ); TEST_PARENT( r, d );
     246    40443861 :   ulong p = fd_wksp_private_pinfo_idx( pinfo[ d ].parent_cidx ); TEST_AND_MARK( p );
     247             : 
     248    40443861 :   uint * _p_child_cidx;
     249    40443861 :   if( fd_wksp_private_pinfo_idx_is_null( p ) ) {
     250    10990746 :     _p_child_cidx = &wksp->part_free_cidx;
     251    10990746 :     TEST( (*_p_child_cidx)==d );
     252    29453115 :   } else {
     253    29453115 :     ulong pl = fd_wksp_private_pinfo_idx( pinfo[ p ].left_cidx  ); /* One should be marked from above */
     254    29453115 :     ulong pr = fd_wksp_private_pinfo_idx( pinfo[ p ].right_cidx ); /* The other should not. */
     255    29453115 :     int is_left_child  = (pl==d);
     256    29453115 :     int is_right_child = (pr==d);
     257    29453115 :     TEST( is_left_child!=is_right_child );
     258    29452713 :     _p_child_cidx = fd_ptr_if( is_left_child, &pinfo[ p ].left_cidx, &pinfo[ p ].right_cidx );
     259    29452713 :   }
     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    32948502 :   if( !fd_wksp_private_pinfo_idx_is_null( j ) ) {
     268     5582262 :     pinfo[ j ].in_same     = 0U;
     269     5582262 :     pinfo[ j ].left_cidx   = fd_wksp_private_pinfo_cidx( l );
     270     5582262 :     pinfo[ j ].right_cidx  = fd_wksp_private_pinfo_cidx( r );
     271     5582262 :     pinfo[ j ].parent_cidx = fd_wksp_private_pinfo_cidx( p );
     272             :   //pinfo[ j ].same_cidx unchanged
     273             : 
     274     5582262 :     uint j_prio = pinfo[ j ].heap_prio;
     275     5582262 :     uint d_prio = pinfo[ d ].heap_prio;
     276     5582262 :     pinfo[ j ].heap_prio = d_prio & ((1UL<<31)-1UL); /* Quell dubious compiler warning */
     277     5582262 :     pinfo[ d ].heap_prio = j_prio & ((1UL<<31)-1UL); /* " */
     278             : 
     279     5582262 :     if( !fd_wksp_private_pinfo_idx_is_null( l ) ) pinfo[ l ].parent_cidx = fd_wksp_private_pinfo_cidx( j );
     280     5582262 :     if( !fd_wksp_private_pinfo_idx_is_null( r ) ) pinfo[ r ].parent_cidx = fd_wksp_private_pinfo_cidx( j );
     281     5582262 :     *_p_child_cidx = fd_wksp_private_pinfo_cidx( j );
     282             : 
     283     5582262 :     goto done;
     284     5582262 :   }
     285             : 
     286    44109927 :   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    44109927 :     if( fd_wksp_private_pinfo_idx_is_null( l ) ) {
     304    18508944 :       if( !fd_wksp_private_pinfo_idx_is_null( r ) ) pinfo[ r ].parent_cidx = fd_wksp_private_pinfo_cidx( p );
     305    18508944 :       *_p_child_cidx = fd_wksp_private_pinfo_cidx( r );
     306    18508944 :       break;
     307    18508944 :     }
     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    25600983 :     if( fd_wksp_private_pinfo_idx_is_null( r ) ) {
     314     8857296 :       pinfo[ l ].parent_cidx = fd_wksp_private_pinfo_cidx( p );
     315     8857296 :       *_p_child_cidx = fd_wksp_private_pinfo_cidx( l );
     316     8857296 :       break;
     317     8857296 :     }
     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    16743687 :     uint l_prio = pinfo[ l ].heap_prio;
     327    16743687 :     uint r_prio = pinfo[ r ].heap_prio;
     328             : 
     329    16743687 :     int promote_left = (l_prio>r_prio) | ((l_prio==r_prio) & (!((p ^ d) & 1UL)));
     330    16743687 :     if( promote_left ) {
     331             : 
     332     9074766 :       ulong t = fd_wksp_private_pinfo_idx( pinfo[ l ].right_cidx ); TEST_AND_MARK( t ); TEST_PARENT( t, l );
     333             : 
     334     9074766 :       *_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     9074766 :       _p_child_cidx = &pinfo[ l ].right_cidx; /* TBD next iteration */
     340             : 
     341     9074766 :       p = l;
     342     9074766 :       l = t;
     343             : 
     344     9074766 :     } else { /* This is the mirror image of the above */
     345             : 
     346     7668921 :       ulong t = fd_wksp_private_pinfo_idx( pinfo[ r ].left_cidx ); TEST_AND_MARK( t ); TEST_PARENT( t, r );
     347             : 
     348     7668921 :       *_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     7668921 :       _p_child_cidx = &pinfo[ r ].left_cidx; /* TBD next iteration */
     354             : 
     355     7668921 :       p = r;
     356     7668921 :       r = t;
     357             : 
     358     7668921 :     }
     359             : 
     360    16743687 :   }
     361             : 
     362    43890711 : done:
     363    43890711 :   pinfo[ d ].in_same     = 0U;
     364    43890711 :   pinfo[ d ].left_cidx   = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
     365    43890711 :   pinfo[ d ].right_cidx  = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
     366    43890711 :   pinfo[ d ].same_cidx   = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
     367    43890711 :   pinfo[ d ].parent_cidx = fd_wksp_private_pinfo_cidx( FD_WKSP_PRIVATE_PINFO_IDX_NULL );
     368    43890711 :   return FD_WKSP_SUCCESS;
     369    27366240 : }
     370             : 
     371             : #undef TEST_PARENT
     372             : #undef TEST_AND_MARK
     373             : #undef TEST

Generated by: LCOV version 1.14