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 316671 : fd_quic_pkt_meta_t * pool ) { 7 1583355 : for( ulong enc_level=0; enc_level<4; enc_level++ ) { 8 1266684 : void* mem = fd_quic_pkt_meta_treap_new( &tracker->sent_pkt_metas[enc_level], 9 1266684 : total_meta_cnt ); 10 1266684 : mem = fd_quic_pkt_meta_treap_join( mem ); 11 1266684 : if( FD_UNLIKELY( !mem ) ) return NULL; 12 1266684 : } 13 316671 : tracker->pool = pool; 14 : 15 316671 : return tracker; 16 316671 : } 17 : 18 : void 19 : fd_quic_pkt_meta_ds_init_pool( fd_quic_pkt_meta_t * pool, 20 3387 : ulong total_meta_cnt ) { 21 3387 : fd_quic_pkt_meta_treap_seed( pool, total_meta_cnt, (ulong)fd_log_wallclock() ); 22 3387 : } 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 13337494 : fd_quic_pkt_meta_t * pool ) { 28 13337494 : fd_quic_pkt_meta_treap_ele_insert( ds, pkt_meta, pool ); 29 13337494 : } 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 251370 : ulong pkt_number_hi ) { 37 : 38 251370 : fd_quic_pkt_meta_ds_fwd_iter_t l_iter = fd_quic_pkt_meta_ds_idx_ge( ds, pkt_number_lo, pool ); 39 251370 : fd_quic_pkt_meta_t * prev = NULL; 40 251370 : ulong cnt_removed = 0; 41 : 42 251370 : for( fd_quic_pkt_meta_ds_fwd_iter_t iter = l_iter; 43 13564458 : !fd_quic_pkt_meta_ds_fwd_iter_done( iter ); 44 13319166 : iter = fd_quic_pkt_meta_ds_fwd_iter_next( iter, pool ) ) { 45 13319166 : fd_quic_pkt_meta_t * e = fd_quic_pkt_meta_ds_fwd_iter_ele( iter, pool ); 46 13319166 : if( FD_UNLIKELY( e->key.pkt_num > pkt_number_hi ) ) break; 47 13313088 : if( FD_LIKELY( prev ) ) { 48 13061787 : fd_quic_pkt_meta_treap_ele_remove( ds, prev, pool ); 49 13061787 : fd_quic_pkt_meta_pool_ele_release( pool, prev ); 50 13061787 : cnt_removed++; 51 13061787 : } 52 13313088 : prev = e; 53 13313088 : } 54 251370 : if( FD_LIKELY( prev ) ) { 55 251301 : fd_quic_pkt_meta_treap_ele_remove( ds, prev, pool ); 56 251301 : fd_quic_pkt_meta_pool_ele_release( pool, prev ); 57 251301 : cnt_removed++; 58 251301 : } 59 251370 : return cnt_removed; 60 251370 : } 61 : 62 : fd_quic_pkt_meta_t * 63 : fd_quic_pkt_meta_min( fd_quic_pkt_meta_ds_t * ds, 64 54463144 : fd_quic_pkt_meta_t * pool ) { 65 : 66 54463144 : fd_quic_pkt_meta_ds_fwd_iter_t iter = fd_quic_pkt_meta_ds_fwd_iter_init( ds, pool ); 67 54463144 : if( FD_UNLIKELY( fd_quic_pkt_meta_ds_fwd_iter_done( iter ) ) ) return NULL; 68 13092547 : return fd_quic_pkt_meta_ds_fwd_iter_ele( iter, pool ); 69 54463144 : } 70 : 71 : void 72 : fd_quic_pkt_meta_ds_clear( fd_quic_pkt_meta_tracker_t * tracker, 73 48168 : uint enc_level ) { 74 48168 : ulong ele_max = fd_quic_pkt_meta_treap_ele_max( &tracker->sent_pkt_metas[enc_level] ); 75 48168 : fd_quic_pkt_meta_treap_new( &tracker->sent_pkt_metas[enc_level], ele_max ); 76 48168 : }