Line data Source code
1 : #include "fd_quic_log_tx.h"
2 : #include "../../../tango/dcache/fd_dcache.h"
3 :
4 : /* fd_quic_log_buf API ************************************************/
5 :
6 : FD_FN_CONST ulong
7 10935 : fd_quic_log_buf_align( void ) {
8 10935 : return FD_QUIC_LOG_BUF_ALIGN;
9 10935 : }
10 :
11 : FD_FN_CONST ulong
12 13065 : fd_quic_log_buf_footprint( ulong depth ) {
13 13065 : if( FD_UNLIKELY( depth>INT_MAX ) ) return 0UL;
14 13065 : depth = fd_ulong_max( depth, FD_MCACHE_BLOCK );
15 :
16 13065 : ulong mcache_footprint = fd_mcache_footprint( depth, 0 );
17 13065 : ulong req_data_sz = fd_dcache_req_data_sz( FD_QUIC_LOG_MTU, depth, 1, 1 );
18 13065 : ulong dcache_footprint = fd_dcache_footprint( req_data_sz, 0UL );
19 :
20 13065 : if( FD_UNLIKELY( !mcache_footprint ) ) return 0UL;
21 13065 : if( FD_UNLIKELY( !req_data_sz ) ) return 0UL;
22 13065 : if( FD_UNLIKELY( !dcache_footprint ) ) return 0UL;
23 :
24 13065 : if( FD_UNLIKELY( mcache_footprint > INT_MAX ) ) return 0UL;
25 13065 : if( FD_UNLIKELY( dcache_footprint > INT_MAX ) ) return 0UL;
26 :
27 : /* Keep this in sync with FD_QUIC_LOG_BUF_FOOTPRINT */
28 13065 : ulong l = FD_LAYOUT_INIT;
29 13065 : l = FD_LAYOUT_APPEND( l, FD_QUIC_LOG_BUF_ALIGN, sizeof(fd_quic_log_buf_t) );
30 13065 : l = FD_LAYOUT_APPEND( l, FD_MCACHE_ALIGN, mcache_footprint );
31 13065 : l = FD_LAYOUT_APPEND( l, FD_DCACHE_ALIGN, dcache_footprint );
32 13065 : l = FD_LAYOUT_FINI( l, FD_QUIC_LOG_BUF_ALIGN );
33 13065 : return l;
34 13065 : }
35 :
36 : void *
37 : fd_quic_log_buf_new( void * shmlog,
38 2130 : ulong depth ) {
39 :
40 2130 : depth = fd_ulong_max( depth, FD_MCACHE_BLOCK );
41 2130 : if( FD_UNLIKELY( !shmlog ) ) {
42 0 : FD_LOG_WARNING(( "NULL shmlog" ));
43 0 : return NULL;
44 0 : }
45 2130 : if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)shmlog, FD_QUIC_LOG_BUF_ALIGN ) ) ) {
46 0 : FD_LOG_WARNING(( "misaligned shmlog" ));
47 0 : return NULL;
48 0 : }
49 2130 : ulong sz = fd_quic_log_buf_footprint( depth );
50 2130 : if( FD_UNLIKELY( !sz ) ) {
51 0 : FD_LOG_WARNING(( "invalid footprint for depth %lu", depth ));
52 0 : return NULL;
53 0 : }
54 2130 : fd_memset( shmlog, 0, sz );
55 :
56 : /* Keep this in sync with FD_QUIC_LOG_BUF_FOOTPRINT */
57 2130 : ulong mcache_footprint = fd_mcache_footprint( depth, 0 );
58 2130 : ulong req_data_sz = fd_dcache_req_data_sz( FD_QUIC_LOG_MTU, depth, 1, 1 );
59 2130 : ulong dcache_footprint = fd_dcache_footprint( req_data_sz, 0UL );
60 2130 : FD_SCRATCH_ALLOC_INIT( l, shmlog );
61 2130 : fd_quic_log_buf_t * log = FD_SCRATCH_ALLOC_APPEND( l, FD_QUIC_LOG_BUF_ALIGN, sizeof(fd_quic_log_buf_t) );
62 2130 : void * mcache_mem = FD_SCRATCH_ALLOC_APPEND( l, FD_MCACHE_ALIGN, mcache_footprint );
63 2130 : void * dcache_mem = FD_SCRATCH_ALLOC_APPEND( l, FD_DCACHE_ALIGN, dcache_footprint );
64 2130 : FD_SCRATCH_ALLOC_FINI( l, FD_QUIC_LOG_BUF_ALIGN );
65 :
66 2130 : ulong seq0 = 0UL;
67 2130 : fd_frag_meta_t * mcache = fd_mcache_join( fd_mcache_new( mcache_mem, depth, 0UL, seq0 ) );
68 2130 : void * dcache = fd_dcache_join( fd_dcache_new( dcache_mem, req_data_sz, 0UL ) );
69 2130 : if( FD_UNLIKELY( !mcache ) ) return NULL;
70 2130 : if( FD_UNLIKELY( !dcache ) ) return NULL;
71 2130 : fd_mcache_seq_laddr( mcache )[0] = seq0;
72 :
73 2130 : uint chunk0 = (uint)fd_dcache_compact_chunk0( log, dcache );
74 2130 : uint wmark = (uint)fd_dcache_compact_wmark ( log, dcache, FD_QUIC_LOG_MTU );
75 2130 : uint chunk1 = (uint)fd_dcache_compact_chunk1( log, dcache );
76 :
77 2130 : *log = (fd_quic_log_buf_t) {
78 2130 : .abi = {
79 2130 : .magic = 0UL,
80 2130 : .mcache_off = (uint)( (ulong)mcache_mem - (ulong)log ),
81 2130 : .chunk0 = chunk0,
82 2130 : .chunk1 = chunk1
83 2130 : },
84 2130 : .dcache_off = (uint)( (ulong)dcache_mem - (ulong)log ),
85 2130 : .chunk0 = chunk0,
86 2130 : .wmark = wmark,
87 2130 : };
88 :
89 2130 : FD_COMPILER_MFENCE();
90 2130 : log->magic = FD_QUIC_LOG_BUF_MAGIC;
91 2130 : FD_COMPILER_MFENCE();
92 2130 : log->abi.magic = FD_QUIC_LOG_MAGIC;
93 2130 : FD_COMPILER_MFENCE();
94 :
95 2130 : return shmlog;
96 2130 : }
97 :
98 : void *
99 2127 : fd_quic_log_buf_delete( void * shmlog ) {
100 2127 : if( FD_UNLIKELY( !shmlog ) ) {
101 0 : FD_LOG_WARNING(( "NULL shmlog" ));
102 0 : return NULL;
103 0 : }
104 2127 : if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)shmlog, FD_QUIC_LOG_BUF_ALIGN ) ) ) {
105 0 : FD_LOG_WARNING(( "misaligned shmlog" ));
106 0 : return NULL;
107 0 : }
108 :
109 2127 : fd_quic_log_buf_t * log = shmlog;
110 2127 : if( FD_UNLIKELY( log->magic!=FD_QUIC_LOG_BUF_MAGIC ) ) {
111 0 : FD_LOG_WARNING(( "bad magic" ));
112 0 : }
113 :
114 2127 : void * mcache_mem = (void *)( (ulong)log + log->abi.mcache_off );
115 2127 : fd_mcache_delete( mcache_mem );
116 :
117 2127 : void * dcache_mem = (void *)( (ulong)log + log->dcache_off );
118 2127 : fd_dcache_delete( dcache_mem );
119 :
120 2127 : log->abi.magic = 0UL;
121 2127 : FD_COMPILER_MFENCE();
122 2127 : log->magic = 0UL;
123 2127 : FD_COMPILER_MFENCE();
124 2127 : return log;
125 2127 : }
126 :
127 : /* fd_quic_log_tx API *************************************************/
128 :
129 : fd_quic_log_tx_t *
130 : fd_quic_log_tx_join( fd_quic_log_tx_t * tx,
131 3327 : void * shmlog ) {
132 :
133 3327 : if( FD_UNLIKELY( !shmlog ) ) {
134 0 : FD_LOG_WARNING(( "NULL shmlog" ));
135 0 : return NULL;
136 0 : }
137 3327 : if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)shmlog, FD_QUIC_LOG_BUF_ALIGN ) ) ) {
138 0 : FD_LOG_WARNING(( "misaligned shmlog" ));
139 0 : return NULL;
140 0 : }
141 :
142 3327 : fd_quic_log_buf_t * log = shmlog;
143 3327 : if( FD_UNLIKELY( log->magic != FD_QUIC_LOG_BUF_MAGIC ) ) {
144 0 : FD_LOG_WARNING(( "bad magic" ));
145 0 : return NULL;
146 0 : }
147 :
148 3327 : fd_frag_meta_t * mcache = fd_mcache_join( (void *)( (ulong)log + log->abi.mcache_off ) );
149 3327 : if( FD_UNLIKELY( !mcache ) ) return NULL;
150 3327 : void * dcache = fd_dcache_join( (void *)( (ulong)log + log->dcache_off ) );
151 3327 : if( FD_UNLIKELY( !dcache ) ) return NULL;
152 :
153 3327 : ulong * mcache_seq = fd_mcache_seq_laddr( mcache );
154 :
155 3327 : *tx = (fd_quic_log_tx_t) {
156 3327 : .mcache = mcache,
157 3327 : .mcache_seq = mcache_seq,
158 3327 : .base = shmlog,
159 3327 : .depth = fd_mcache_depth( mcache ),
160 3327 : .seq = mcache_seq[0],
161 3327 : .chunk = log->chunk0,
162 3327 : .chunk0 = log->chunk0,
163 3327 : .wmark = log->wmark,
164 3327 : };
165 3327 : return tx;
166 3327 : }
167 :
168 : void *
169 0 : fd_quic_log_tx_leave( fd_quic_log_tx_t * log ) {
170 0 : if( FD_UNLIKELY( !log ) ) {
171 0 : FD_LOG_WARNING(( "NULL log" ));
172 0 : return NULL;
173 0 : }
174 0 : fd_quic_log_tx_seq_update( log );
175 0 : memset( log, 0, sizeof(fd_quic_log_tx_t) );
176 0 : return log;
177 0 : }
178 :
179 : /* fd_quic_log_rx API *************************************************/
180 :
181 : fd_quic_log_rx_t *
182 : fd_quic_log_rx_join( fd_quic_log_rx_t * rx,
183 3 : void * shmlog ) {
184 :
185 3 : if( FD_UNLIKELY( !shmlog ) ) {
186 0 : FD_LOG_WARNING(( "NULL shmlog" ));
187 0 : return NULL;
188 0 : }
189 3 : if( FD_UNLIKELY( !fd_ulong_is_aligned( (ulong)shmlog, FD_QUIC_LOG_ALIGN ) ) ) {
190 0 : FD_LOG_WARNING(( "misaligned shmlog" ));
191 0 : return NULL;
192 0 : }
193 :
194 3 : fd_quic_log_abi_t * abi = shmlog;
195 3 : if( FD_UNLIKELY( abi->magic != FD_QUIC_LOG_MAGIC ) ) {
196 0 : FD_LOG_WARNING(( "bad magic" ));
197 0 : return NULL;
198 0 : }
199 :
200 3 : fd_frag_meta_t * mcache = fd_mcache_join( (void *)( (ulong)shmlog + abi->mcache_off ) );
201 3 : if( FD_UNLIKELY( !mcache ) ) return NULL;
202 3 : ulong const * mcache_seq = fd_mcache_seq_laddr_const( mcache );
203 :
204 3 : void * base = shmlog;
205 3 : ulong seq = fd_mcache_seq_query( mcache_seq );
206 :
207 3 : *rx = (fd_quic_log_rx_t) {
208 3 : .mcache = mcache,
209 3 : .mcache_seq = mcache_seq,
210 3 : .base = base,
211 3 : .data_lo_laddr = (ulong)fd_chunk_to_laddr_const( base, abi->chunk0 ),
212 3 : .data_hi_laddr = (ulong)fd_chunk_to_laddr_const( base, abi->chunk1 ),
213 3 : .depth = fd_mcache_depth( mcache ),
214 3 : .seq = seq
215 3 : };
216 3 : return rx;
217 3 : }
218 :
219 : void *
220 0 : fd_quic_log_rx_leave( fd_quic_log_rx_t * log ) {
221 0 : if( FD_UNLIKELY( !log ) ) {
222 0 : FD_LOG_WARNING(( "NULL log" ));
223 0 : return NULL;
224 0 : }
225 0 : memset( log, 0, sizeof(fd_quic_log_rx_t) );
226 0 : return log;
227 0 : }
|