LCOV - code coverage report
Current view: top level - waltz/quic - fd_quic_pkt_meta.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 0 65 0.0 %
Date: 2026-03-27 20:43:40 Functions: 0 8 0.0 %

          Line data    Source code
       1             : #include "fd_quic_pkt_meta.h"
       2             : 
       3             : void *
       4             : fd_quic_pkt_meta_tracker_init( fd_quic_pkt_meta_tracker_t * tracker,
       5             :                                ulong                        total_meta_cnt,
       6           0 :                                fd_quic_pkt_meta_t         * pool ) {
       7           0 :   for( ulong enc_level=0; enc_level<4; enc_level++ ) {
       8           0 :     void* mem = fd_quic_pkt_meta_treap_new( &tracker->sent_pkt_metas[enc_level],
       9           0 :                                             total_meta_cnt );
      10           0 :     mem = fd_quic_pkt_meta_treap_join( mem );
      11           0 :     if( FD_UNLIKELY( !mem ) ) return NULL;
      12           0 :   }
      13           0 :   tracker->pool = pool;
      14             : 
      15           0 :   return tracker;
      16           0 : }
      17             : 
      18             : void
      19             : fd_quic_pkt_meta_ds_init_pool( fd_quic_pkt_meta_t * pool,
      20           0 :                                ulong                total_meta_cnt ) {
      21           0 :   fd_quic_pkt_meta_treap_seed( pool, total_meta_cnt, (ulong)fd_tickcount() );
      22           0 : }
      23             : 
      24             : void
      25             : fd_quic_pkt_meta_insert( fd_quic_pkt_meta_ds_t * ds,
      26             :                          fd_quic_pkt_meta_t    * pkt_meta,
      27           0 :                          fd_quic_pkt_meta_t    * pool ) {
      28           0 :   fd_quic_pkt_meta_treap_ele_insert( ds, pkt_meta, pool );
      29           0 : }
      30             : 
      31             : 
      32             : ulong
      33             : fd_quic_pkt_meta_remove_range( fd_quic_pkt_meta_ds_t * ds,
      34             :                                fd_quic_pkt_meta_t    * pool,
      35             :                                ulong                   pkt_number_lo,
      36           0 :                                ulong                   pkt_number_hi ) {
      37             : 
      38           0 :   fd_quic_pkt_meta_ds_fwd_iter_t    l_iter =  fd_quic_pkt_meta_ds_idx_ge( ds, pkt_number_lo, pool );
      39           0 :   fd_quic_pkt_meta_t              * prev   =  NULL;
      40           0 :   ulong                        cnt_removed =  0;
      41             : 
      42           0 :   for( fd_quic_pkt_meta_ds_fwd_iter_t iter = l_iter;
      43           0 :                                             !fd_quic_pkt_meta_ds_fwd_iter_done( iter );
      44           0 :                                             iter = fd_quic_pkt_meta_ds_fwd_iter_next( iter, pool ) ) {
      45           0 :     fd_quic_pkt_meta_t * e = fd_quic_pkt_meta_ds_fwd_iter_ele( iter, pool );
      46           0 :     if( FD_UNLIKELY( e->key.pkt_num > pkt_number_hi ) ) break;
      47           0 :     if( FD_LIKELY( prev ) ) {
      48           0 :       fd_quic_pkt_meta_treap_ele_remove( ds, prev, pool );
      49           0 :       fd_quic_pkt_meta_pool_ele_release( pool, prev );
      50           0 :       cnt_removed++;
      51           0 :     }
      52           0 :     prev = e;
      53           0 :   }
      54           0 :   if( FD_LIKELY( prev ) ) {
      55           0 :     fd_quic_pkt_meta_treap_ele_remove( ds, prev, pool );
      56           0 :     fd_quic_pkt_meta_pool_ele_release( pool, prev );
      57           0 :     cnt_removed++;
      58           0 :   }
      59           0 :   return cnt_removed;
      60           0 : }
      61             : 
      62             : void
      63             : fd_quic_pkt_meta_remove( fd_quic_pkt_meta_ds_t * ds,
      64             :                          fd_quic_pkt_meta_t    * pool,
      65           0 :                          fd_quic_pkt_meta_t    * pkt_meta ) {
      66           0 :   fd_quic_pkt_meta_treap_ele_remove( ds, pkt_meta, pool );
      67           0 :   fd_quic_pkt_meta_pool_ele_release( pool, pkt_meta );
      68           0 : }
      69             : 
      70             : fd_quic_pkt_meta_t *
      71             : fd_quic_pkt_meta_min( fd_quic_pkt_meta_ds_t * ds,
      72           0 :                       fd_quic_pkt_meta_t    * pool ) {
      73             : 
      74           0 :   fd_quic_pkt_meta_ds_fwd_iter_t iter = fd_quic_pkt_meta_ds_fwd_iter_init( ds, pool );
      75           0 :   if( FD_UNLIKELY( fd_quic_pkt_meta_ds_fwd_iter_done( iter ) ) ) return NULL;
      76           0 :   return fd_quic_pkt_meta_ds_fwd_iter_ele( iter, pool );
      77           0 : }
      78             : 
      79             : fd_quic_pkt_meta_ds_fwd_iter_t
      80             : fd_quic_pkt_meta_ds_idx_le( fd_quic_pkt_meta_ds_t * ds,
      81             :                             fd_quic_pkt_meta_t    * pool,
      82           0 :                             ulong                   pkt_number ) {
      83             :   /* One might first consider using le with composite key that sets
      84             :      type and stream_id to their max values, and then traversing
      85             :      back to the first pkt_meta with this pkt_number. But when we
      86             :      have many concurrent streams, that's a lot of traversal.
      87             : 
      88             :      We instead use lt to jump to the last pkt_meta right before
      89             :      our query. Edge case: if next pkt_meta has the wrong pkt_num,
      90             :      we know that 'pkt_number' is missing and should stick with prev */
      91           0 :   fd_quic_pkt_meta_ds_fwd_iter_t prev = fd_quic_pkt_meta_treap_idx_lt( ds,
      92           0 :                                          (fd_quic_pkt_meta_key_t){
      93           0 :                                           .pkt_num = pkt_number & FD_QUIC_PKT_META_PKT_NUM_MASK,
      94           0 :                                           .type = 0,
      95           0 :                                           .stream_id = 0},
      96           0 :                                          pool );
      97           0 :   if( FD_UNLIKELY( fd_quic_pkt_meta_ds_fwd_iter_done( prev ) ) ) return prev;
      98           0 :   fd_quic_pkt_meta_ds_fwd_iter_t next = fd_quic_pkt_meta_treap_fwd_iter_next( prev, pool );
      99           0 :   if( FD_UNLIKELY( fd_quic_pkt_meta_ds_fwd_iter_done( next ) ) ) return prev;
     100             : 
     101           0 :   fd_quic_pkt_meta_t * next_e = fd_quic_pkt_meta_ds_fwd_iter_ele( next, pool );
     102           0 :   return next_e->key.pkt_num==pkt_number ? next : prev;
     103           0 : }
     104             : 
     105             : 
     106             : void
     107             : fd_quic_pkt_meta_ds_clear( fd_quic_pkt_meta_tracker_t * tracker,
     108           0 :                         uint                         enc_level ) {
     109           0 :   ulong ele_max = fd_quic_pkt_meta_treap_ele_max( &tracker->sent_pkt_metas[enc_level] );
     110           0 :   fd_quic_pkt_meta_treap_new( &tracker->sent_pkt_metas[enc_level], ele_max );
     111           0 : }

Generated by: LCOV version 1.14