@@ -200,25 +200,11 @@ on_bytes_acked (udx_stream_write_buf_t *wbuf, size_t bytes, bool cancelled) {
200200 }
201201}
202202
203- static void
204- deref_packet (udx_packet_t * pkt ) {
205- if (-- pkt -> ref_count == 0 ) {
206- if (pkt -> bufs != & pkt -> buf_sml [0 ]) {
207- free (pkt -> bufs );
208- free (pkt -> wbufs );
209- }
210- free (pkt );
211- }
212- }
213-
214203static void
215204cancel_packet (udx_packet_t * pkt ) {
216- uv_buf_t * bufs = pkt -> bufs ;
217- udx_stream_write_buf_t * * wbufs = pkt -> wbufs ;
218-
219205 for (int i = 0 ; i < pkt -> nwbufs ; i ++ ) {
220- size_t buf_len = bufs [i + 1 ].len ;
221- udx_stream_write_buf_t * wbuf = wbufs [i ];
206+ size_t buf_len = pkt -> bufs [i + 1 ].len ;
207+ udx_stream_write_buf_t * wbuf = pkt -> wbufs [i ];
222208 on_bytes_acked (wbuf , buf_len , true);
223209
224210 // todo: move into on_bytes_acked itself
@@ -228,8 +214,20 @@ cancel_packet (udx_packet_t *pkt) {
228214 write -> on_ack (write , UV_ECANCELED , 0 );
229215 }
230216 }
217+ }
231218
232- deref_packet (pkt );
219+ static void
220+ deref_packet (udx_packet_t * pkt ) {
221+ if (-- pkt -> ref_count == 0 ) {
222+ if (pkt -> cancelled ) {
223+ cancel_packet (pkt );
224+ }
225+ if (pkt -> bufs != & pkt -> buf_sml [0 ]) {
226+ free (pkt -> bufs );
227+ free (pkt -> wbufs );
228+ }
229+ free (pkt );
230+ }
233231}
234232
235233static void
@@ -242,15 +240,16 @@ clear_outgoing_packets (udx_stream_t *stream) {
242240 if (stream -> pkt ) {
243241 assert (stream -> pkt -> ref_count == 1 );
244242 cancel_packet (stream -> pkt );
243+ deref_packet (stream -> pkt );
245244 }
246245
247246 // We should make sure all existing packets do not send, and notify the user that they failed
248247 for (uint32_t seq = stream -> remote_acked ; seq != stream -> seq ; seq ++ ) {
249248 udx_packet_t * pkt = (udx_packet_t * ) udx__cirbuf_remove (& (stream -> outgoing ), seq );
250249
251250 if (pkt == NULL ) continue ;
252-
253- cancel_packet (pkt );
251+ pkt -> cancelled = true;
252+ deref_packet (pkt );
254253 }
255254
256255 while (stream -> write_queue .len > 0 ) {
@@ -310,8 +309,9 @@ udx_write_header (uint8_t header[20], udx_stream_t *stream, int type) {
310309// returns 1 on success, zero if packet can't be promoted to a probe packet
311310static int
312311mtu_probeify_packet (udx_packet_t * pkt , int wanted_size ) {
313-
314- assert (wanted_size > pkt -> size );
312+ if (wanted_size > pkt -> size ) {
313+ return 0 ;
314+ }
315315
316316 // cannot probeify a packet with 1) no data 2) already has padding
317317 if (pkt -> nwbufs < 1 || pkt -> header [3 ] != 0 ) {
@@ -370,8 +370,19 @@ finalize_maybe (uv_handle_t *timer) {
370370// 2. if you call this on the send path, you must immediately return from
371371// send_stream_packets
372372
373- static int
373+ static void
374+ close_stream_internal (udx_stream_t * stream , int err );
375+
376+ void
374377close_stream (udx_stream_t * stream , int err ) {
378+ if (stream -> status & UDX_STREAM_DESTROYING ) {
379+ return ;
380+ }
381+ close_stream_internal (stream , err );
382+ }
383+
384+ void
385+ close_stream_internal (udx_stream_t * stream , int err ) {
375386 assert ((stream -> status & UDX_STREAM_CLOSED ) == 0 );
376387 stream -> status |= UDX_STREAM_CLOSED ;
377388 stream -> status &= ~UDX_STREAM_CONNECTED ;
@@ -441,8 +452,6 @@ close_stream (udx_stream_t *stream, int err) {
441452 if (udx -> teardown && socket != NULL && socket -> streams == NULL ) {
442453 udx_socket_close (socket );
443454 }
444-
445- return 1 ;
446455}
447456
448457static void
@@ -873,7 +882,7 @@ send_new_packet (udx_stream_t *stream, int probe_type) {
873882
874883 if (first_alloc ) {
875884 pkt -> bufs = malloc ((pkt -> nwbufs_capacity + 1 ) * sizeof (pkt -> bufs [0 ]));
876- pkt -> wbufs = malloc ((pkt -> nwbufs_capacity + 1 ) * sizeof (pkt -> wbufs [0 ]));
885+ pkt -> wbufs = malloc ((pkt -> nwbufs_capacity ) * sizeof (pkt -> wbufs [0 ]));
877886 memcpy (pkt -> bufs , pkt -> buf_sml , sizeof (pkt -> buf_sml ));
878887 memcpy (pkt -> wbufs , pkt -> wbuf_sml , sizeof (pkt -> wbuf_sml ));
879888 } else {
@@ -1798,12 +1807,21 @@ static void
17981807on_uv_udp_recv (uv_udp_t * handle , ssize_t nread , const uv_buf_t * buf , const struct sockaddr * addr , unsigned flags ) {
17991808 if (nread == 0 && addr == NULL ) return ;
18001809
1810+ if (nread < 0 ) {
1811+ debug_printf ("udx: uv_udp_recv err=%s\n" , uv_strerror (nread ));
1812+ assert (nread != UV_EBADF );
1813+ assert (nread != UV_ENOTSOCK );
1814+ assert (nread != UV_EINVAL );
1815+ assert (nread != UV_EFAULT );
1816+ return ;
1817+ }
1818+
18011819 udx_socket_t * socket = handle -> data ; // todo: cast instead, save a dereference ?
18021820
18031821 assert (!(socket -> status & UDX_SOCKET_CLOSED ));
18041822
18051823 if (flags & UV_UDP_PARTIAL ) {
1806- assert (false && "todo: log error for large messages? " );
1824+ debug_printf ( "udx: uv_udp_recv received partial packet\n " );
18071825 }
18081826
18091827 assert ((size_t ) nread <= buf -> len );
@@ -2681,7 +2699,7 @@ stream_on_destroy_send (udx_stream_t *stream) {
26812699 udx -> packets_tx ++ ;
26822700 udx -> bytes_tx += UDX_HEADER_SIZE ;
26832701
2684- close_stream (stream , 0 );
2702+ close_stream_internal (stream , 0 );
26852703}
26862704
26872705static void
0 commit comments