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 31162879 : fd_quic_pkt_meta_t * pool ) { 28 31162879 : fd_quic_pkt_meta_treap_ele_insert( ds, pkt_meta, pool ); 29 31162879 : } 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 503242 : ulong pkt_number_hi ) { 37 : 38 503242 : fd_quic_pkt_meta_ds_fwd_iter_t l_iter = fd_quic_pkt_meta_ds_idx_ge( ds, pkt_number_lo, pool ); 39 503242 : fd_quic_pkt_meta_t * prev = NULL; 40 503242 : ulong cnt_removed = 0; 41 : 42 503242 : for( fd_quic_pkt_meta_ds_fwd_iter_t iter = l_iter; 43 31641504 : !fd_quic_pkt_meta_ds_fwd_iter_done( iter ); 44 31138343 : iter = fd_quic_pkt_meta_ds_fwd_iter_next( iter, pool ) ) { 45 31138343 : fd_quic_pkt_meta_t * e = fd_quic_pkt_meta_ds_fwd_iter_ele( iter, pool ); 46 31138343 : if( FD_UNLIKELY( e->key.pkt_num > pkt_number_hi ) ) break; 47 31138262 : if( FD_LIKELY( prev ) ) { 48 30635098 : fd_quic_pkt_meta_treap_ele_remove( ds, prev, pool ); 49 30635098 : fd_quic_pkt_meta_pool_ele_release( pool, prev ); 50 30635098 : cnt_removed++; 51 30635098 : } 52 31138262 : prev = e; 53 31138262 : } 54 503242 : if( FD_LIKELY( prev ) ) { 55 503164 : fd_quic_pkt_meta_treap_ele_remove( ds, prev, pool ); 56 503164 : fd_quic_pkt_meta_pool_ele_release( pool, prev ); 57 503164 : cnt_removed++; 58 503164 : } 59 503242 : return cnt_removed; 60 503242 : } 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 126975978 : fd_quic_pkt_meta_t * pool ) { 73 : 74 126975978 : fd_quic_pkt_meta_ds_fwd_iter_t iter = fd_quic_pkt_meta_ds_fwd_iter_init( ds, pool ); 75 126975978 : if( FD_UNLIKELY( fd_quic_pkt_meta_ds_fwd_iter_done( iter ) ) ) return NULL; 76 30625239 : return fd_quic_pkt_meta_ds_fwd_iter_ele( iter, pool ); 77 126975978 : } 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 503080 : 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 503080 : fd_quic_pkt_meta_ds_fwd_iter_t prev = fd_quic_pkt_meta_treap_idx_lt( ds, 92 503080 : (fd_quic_pkt_meta_key_t){ 93 503080 : .pkt_num = pkt_number & FD_QUIC_PKT_META_PKT_NUM_MASK, 94 503080 : .type = 0, 95 503080 : .stream_id = 0}, 96 503080 : pool ); 97 503080 : if( FD_UNLIKELY( fd_quic_pkt_meta_ds_fwd_iter_done( prev ) ) ) return prev; 98 497008 : fd_quic_pkt_meta_ds_fwd_iter_t next = fd_quic_pkt_meta_treap_fwd_iter_next( prev, pool ); 99 497008 : if( FD_UNLIKELY( fd_quic_pkt_meta_ds_fwd_iter_done( next ) ) ) return prev; 100 : 101 478741 : fd_quic_pkt_meta_t * next_e = fd_quic_pkt_meta_ds_fwd_iter_ele( next, pool ); 102 478741 : return next_e->key.pkt_num==pkt_number ? next : prev; 103 497008 : } 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 : }