@@ -94,6 +94,7 @@ typedef struct udx_packet_s udx_packet_t;
94
94
typedef struct udx_socket_send_s udx_socket_send_t ;
95
95
typedef struct udx_stream_send_s udx_stream_send_t ;
96
96
typedef struct udx_stream_write_s udx_stream_write_t ;
97
+ typedef struct udx_stream_write_buf_s udx_stream_write_buf_t ;
97
98
98
99
typedef enum {
99
100
UDX_LOOKUP_FAMILY_IPV4 = 1 ,
@@ -270,54 +271,68 @@ struct udx_packet_s {
270
271
int ttl ;
271
272
int is_retransmit ;
272
273
273
- udx_stream_t * stream ; // pointer to the stream if stream packet
274
-
275
274
uint8_t transmits ;
276
275
bool is_mtu_probe ;
277
276
uint16_t size ;
278
277
uint64_t time_sent ;
279
278
280
- void * ctx ;
279
+ void * ctx ; // stream_send_t | socket_send_t | stream_t
281
280
282
281
struct sockaddr_storage dest ;
283
282
int dest_len ;
284
283
285
284
uint32_t fifo_gc ; // for removing from inflight / retransmit queue
286
- // udx_packet_t *prev; // alternative for inflight / retransmit queues
287
- // udx_packet_t *next; // alternative for inflight / retransmit queues
288
285
289
286
// just alloc it in place here, easier to manage
290
287
char header [UDX_HEADER_SIZE ];
291
- unsigned int bufs_len ;
292
- uv_buf_t bufs [3 ];
288
+ unsigned short nbufs ;
289
+
290
+ // inefficient - only relevant for stream_t packets
291
+ unsigned short nwbufs ;
292
+ udx_stream_write_buf_t * * wbufs ;
293
293
};
294
294
295
295
struct udx_socket_send_s {
296
296
udx_packet_t pkt ;
297
+ uv_buf_t bufs [1 ]; // buf_t[] must be after packet_t
297
298
udx_socket_t * socket ;
298
299
299
300
udx_socket_send_cb on_send ;
300
301
301
302
void * data ;
302
303
};
303
304
304
- struct udx_stream_write_s {
305
- // immutable, original write
305
+ struct udx_stream_write_buf_s {
306
+ // immutable original buf
306
307
uv_buf_t buf ;
307
308
308
- size_t bytes_acked ;
309
+ // 1. remove from write_queue when bytes_inflight + bytes_acked == buf.len
310
+ // 2. free when bytes_acked == buf.len
309
311
size_t bytes_inflight ;
312
+ size_t bytes_acked ;
313
+
314
+ udx_stream_write_t * write ;
315
+
316
+ bool is_write_end ;
317
+ };
310
318
319
+ struct udx_stream_write_s {
320
+ size_t size ;
321
+ size_t bytes_acked ;
311
322
bool is_write_end ;
312
323
313
324
udx_stream_t * stream ;
314
325
udx_stream_ack_cb on_ack ;
315
326
316
327
void * data ;
328
+
329
+ unsigned int nwbufs ;
330
+ udx_stream_write_buf_t wbuf [];
317
331
};
318
332
319
333
struct udx_stream_send_s {
320
334
udx_packet_t pkt ;
335
+ uv_buf_t bufs [3 ]; // buf_t[] must be after packet_t
321
336
udx_stream_t * stream ;
322
337
323
338
udx_stream_send_cb on_send ;
@@ -449,6 +464,9 @@ udx_stream_send (udx_stream_send_t *req, udx_stream_t *stream, const uv_buf_t bu
449
464
int
450
465
udx_stream_write_resume (udx_stream_t * stream , udx_stream_drain_cb drain_cb );
451
466
467
+ int
468
+ udx_stream_write_sizeof (int nwbufs );
469
+
452
470
int
453
471
udx_stream_write (udx_stream_write_t * req , udx_stream_t * stream , const uv_buf_t bufs [], unsigned int bufs_len , udx_stream_ack_cb ack_cb );
454
472
0 commit comments