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 613881 : fd_quic_pkt_meta_t * pool ) { 7 3069405 : for( ulong enc_level=0; enc_level<4; enc_level++ ) { 8 2455524 : void* mem = fd_quic_pkt_meta_treap_new( &tracker->sent_pkt_metas[enc_level], 9 2455524 : total_meta_cnt ); 10 2455524 : mem = fd_quic_pkt_meta_treap_join( mem ); 11 2455524 : if( FD_UNLIKELY( !mem ) ) return NULL; 12 2455524 : } 13 613881 : tracker->pool = pool; 14 : 15 613881 : return tracker; 16 613881 : } 17 : 18 : void 19 : fd_quic_pkt_meta_ds_init_pool( fd_quic_pkt_meta_t * pool, 20 324 : ulong total_meta_cnt ) { 21 324 : fd_quic_pkt_meta_treap_seed( pool, total_meta_cnt, (ulong)fd_tickcount() ); 22 324 : } 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 5856770 : fd_quic_pkt_meta_t * pool ) { 28 5856770 : fd_quic_pkt_meta_treap_ele_insert( ds, pkt_meta, pool ); 29 5856770 : } 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 117328 : ulong pkt_number_hi ) { 37 : 38 117328 : fd_quic_pkt_meta_ds_fwd_iter_t l_iter = fd_quic_pkt_meta_ds_idx_ge( ds, pkt_number_lo, pool ); 39 117328 : fd_quic_pkt_meta_t * prev = NULL; 40 117328 : ulong cnt_removed = 0; 41 : 42 117328 : for( fd_quic_pkt_meta_ds_fwd_iter_t iter = l_iter; 43 5949609 : !fd_quic_pkt_meta_ds_fwd_iter_done( iter ); 44 5832368 : iter = fd_quic_pkt_meta_ds_fwd_iter_next( iter, pool ) ) { 45 5832368 : fd_quic_pkt_meta_t * e = fd_quic_pkt_meta_ds_fwd_iter_ele( iter, pool ); 46 5832368 : if( FD_UNLIKELY( e->key.pkt_num > pkt_number_hi ) ) break; 47 5832281 : if( FD_LIKELY( prev ) ) { 48 5714977 : fd_quic_pkt_meta_treap_ele_remove( ds, prev, pool ); 49 5714977 : fd_quic_pkt_meta_pool_ele_release( pool, prev ); 50 5714977 : cnt_removed++; 51 5714977 : } 52 5832281 : prev = e; 53 5832281 : } 54 117328 : if( FD_LIKELY( prev ) ) { 55 117304 : fd_quic_pkt_meta_treap_ele_remove( ds, prev, pool ); 56 117304 : fd_quic_pkt_meta_pool_ele_release( pool, prev ); 57 117304 : cnt_removed++; 58 117304 : } 59 117328 : return cnt_removed; 60 117328 : } 61 : 62 : void 63 : fd_quic_pkt_meta_remove( fd_quic_pkt_meta_ds_t * ds, 64 : fd_quic_pkt_meta_t * pool, 65 63 : fd_quic_pkt_meta_t * pkt_meta ) { 66 63 : fd_quic_pkt_meta_treap_ele_remove( ds, pkt_meta, pool ); 67 63 : fd_quic_pkt_meta_pool_ele_release( pool, pkt_meta ); 68 63 : } 69 : 70 : fd_quic_pkt_meta_t * 71 : fd_quic_pkt_meta_min( fd_quic_pkt_meta_ds_t * ds, 72 23821372 : fd_quic_pkt_meta_t * pool ) { 73 : 74 23821372 : fd_quic_pkt_meta_ds_fwd_iter_t iter = fd_quic_pkt_meta_ds_fwd_iter_init( ds, pool ); 75 23821372 : if( FD_UNLIKELY( fd_quic_pkt_meta_ds_fwd_iter_done( iter ) ) ) return NULL; 76 5703916 : return fd_quic_pkt_meta_ds_fwd_iter_ele( iter, pool ); 77 23821372 : } 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 98896 : 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 98896 : fd_quic_pkt_meta_ds_fwd_iter_t prev = fd_quic_pkt_meta_treap_idx_lt( ds, 92 98896 : (fd_quic_pkt_meta_key_t){ 93 98896 : .pkt_num = pkt_number & FD_QUIC_PKT_META_PKT_NUM_MASK, 94 98896 : .type = 0, 95 98896 : .stream_id = 0}, 96 98896 : pool ); 97 98896 : if( FD_UNLIKELY( fd_quic_pkt_meta_ds_fwd_iter_done( prev ) ) ) return prev; 98 92830 : fd_quic_pkt_meta_ds_fwd_iter_t next = fd_quic_pkt_meta_treap_fwd_iter_next( prev, pool ); 99 92830 : if( FD_UNLIKELY( fd_quic_pkt_meta_ds_fwd_iter_done( next ) ) ) return prev; 100 : 101 92830 : fd_quic_pkt_meta_t * next_e = fd_quic_pkt_meta_ds_fwd_iter_ele( next, pool ); 102 92830 : return next_e->key.pkt_num==pkt_number ? next : prev; 103 92830 : } 104 : 105 : 106 : void 107 : fd_quic_pkt_meta_ds_clear( fd_quic_pkt_meta_tracker_t * tracker, 108 97476 : uint enc_level ) { 109 97476 : ulong ele_max = fd_quic_pkt_meta_treap_ele_max( &tracker->sent_pkt_metas[enc_level] ); 110 97476 : fd_quic_pkt_meta_treap_new( &tracker->sent_pkt_metas[enc_level], ele_max ); 111 97476 : }