LCOV - code coverage report
Current view: top level - waltz/quic - fd_quic_pkt_meta.c (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 65 65 100.0 %
Date: 2025-11-18 04:32:32 Functions: 8 8 100.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      631320 :                                fd_quic_pkt_meta_t         * pool ) {
       7     3156600 :   for( ulong enc_level=0; enc_level<4; enc_level++ ) {
       8     2525280 :     void* mem = fd_quic_pkt_meta_treap_new( &tracker->sent_pkt_metas[enc_level],
       9     2525280 :                                             total_meta_cnt );
      10     2525280 :     mem = fd_quic_pkt_meta_treap_join( mem );
      11     2525280 :     if( FD_UNLIKELY( !mem ) ) return NULL;
      12     2525280 :   }
      13      631320 :   tracker->pool = pool;
      14             : 
      15      631320 :   return tracker;
      16      631320 : }
      17             : 
      18             : void
      19             : fd_quic_pkt_meta_ds_init_pool( fd_quic_pkt_meta_t * pool,
      20        3417 :                                ulong                total_meta_cnt ) {
      21        3417 :   fd_quic_pkt_meta_treap_seed( pool, total_meta_cnt, (ulong)fd_tickcount() );
      22        3417 : }
      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    27153248 :                          fd_quic_pkt_meta_t    * pool ) {
      28    27153248 :   fd_quic_pkt_meta_treap_ele_insert( ds, pkt_meta, pool );
      29    27153248 : }
      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      441555 :                                ulong                   pkt_number_hi ) {
      37             : 
      38      441555 :   fd_quic_pkt_meta_ds_fwd_iter_t    l_iter =  fd_quic_pkt_meta_ds_idx_ge( ds, pkt_number_lo, pool );
      39      441555 :   fd_quic_pkt_meta_t              * prev   =  NULL;
      40      441555 :   ulong                        cnt_removed =  0;
      41             : 
      42      441555 :   for( fd_quic_pkt_meta_ds_fwd_iter_t iter = l_iter;
      43    27570162 :                                             !fd_quic_pkt_meta_ds_fwd_iter_done( iter );
      44    27128688 :                                             iter = fd_quic_pkt_meta_ds_fwd_iter_next( iter, pool ) ) {
      45    27128688 :     fd_quic_pkt_meta_t * e = fd_quic_pkt_meta_ds_fwd_iter_ele( iter, pool );
      46    27128688 :     if( FD_UNLIKELY( e->key.pkt_num > pkt_number_hi ) ) break;
      47    27128607 :     if( FD_LIKELY( prev ) ) {
      48    26687130 :       fd_quic_pkt_meta_treap_ele_remove( ds, prev, pool );
      49    26687130 :       fd_quic_pkt_meta_pool_ele_release( pool, prev );
      50    26687130 :       cnt_removed++;
      51    26687130 :     }
      52    27128607 :     prev = e;
      53    27128607 :   }
      54      441555 :   if( FD_LIKELY( prev ) ) {
      55      441477 :     fd_quic_pkt_meta_treap_ele_remove( ds, prev, pool );
      56      441477 :     fd_quic_pkt_meta_pool_ele_release( pool, prev );
      57      441477 :     cnt_removed++;
      58      441477 :   }
      59      441555 :   return cnt_removed;
      60      441555 : }
      61             : 
      62             : void
      63             : fd_quic_pkt_meta_remove( fd_quic_pkt_meta_ds_t * ds,
      64             :                          fd_quic_pkt_meta_t    * pool,
      65         234 :                          fd_quic_pkt_meta_t    * pkt_meta ) {
      66         234 :   fd_quic_pkt_meta_treap_ele_remove( ds, pkt_meta, pool );
      67         234 :   fd_quic_pkt_meta_pool_ele_release( pool, pkt_meta );
      68         234 : }
      69             : 
      70             : fd_quic_pkt_meta_t *
      71             : fd_quic_pkt_meta_min( fd_quic_pkt_meta_ds_t * ds,
      72   110629019 :                       fd_quic_pkt_meta_t    * pool ) {
      73             : 
      74   110629019 :   fd_quic_pkt_meta_ds_fwd_iter_t iter = fd_quic_pkt_meta_ds_fwd_iter_init( ds, pool );
      75   110629019 :   if( FD_UNLIKELY( fd_quic_pkt_meta_ds_fwd_iter_done( iter ) ) ) return NULL;
      76    26677295 :   return fd_quic_pkt_meta_ds_fwd_iter_ele( iter, pool );
      77   110629019 : }
      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      441393 :                             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      441393 :   fd_quic_pkt_meta_ds_fwd_iter_t prev = fd_quic_pkt_meta_treap_idx_lt( ds,
      92      441393 :                                          (fd_quic_pkt_meta_key_t){
      93      441393 :                                           .pkt_num = pkt_number & FD_QUIC_PKT_META_PKT_NUM_MASK,
      94      441393 :                                           .type = 0,
      95      441393 :                                           .stream_id = 0},
      96      441393 :                                          pool );
      97      441393 :   if( FD_UNLIKELY( fd_quic_pkt_meta_ds_fwd_iter_done( prev ) ) ) return prev;
      98      435321 :   fd_quic_pkt_meta_ds_fwd_iter_t next = fd_quic_pkt_meta_treap_fwd_iter_next( prev, pool );
      99      435321 :   if( FD_UNLIKELY( fd_quic_pkt_meta_ds_fwd_iter_done( next ) ) ) return prev;
     100             : 
     101      417054 :   fd_quic_pkt_meta_t * next_e = fd_quic_pkt_meta_ds_fwd_iter_ele( next, pool );
     102      417054 :   return next_e->key.pkt_num==pkt_number ? next : prev;
     103      435321 : }
     104             : 
     105             : 
     106             : void
     107             : fd_quic_pkt_meta_ds_clear( fd_quic_pkt_meta_tracker_t * tracker,
     108      105912 :                         uint                         enc_level ) {
     109      105912 :   ulong ele_max = fd_quic_pkt_meta_treap_ele_max( &tracker->sent_pkt_metas[enc_level] );
     110      105912 :   fd_quic_pkt_meta_treap_new( &tracker->sent_pkt_metas[enc_level], ele_max );
     111      105912 : }

Generated by: LCOV version 1.14