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 : }