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