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

Generated by: LCOV version 1.14