]> git.sesse.net Git - vlc/commitdiff
udp: avoid alloc/free on I/O error
authorRémi Denis-Courmont <remi@remlab.net>
Tue, 17 Mar 2015 17:41:04 +0000 (19:41 +0200)
committerRémi Denis-Courmont <remi@remlab.net>
Tue, 17 Mar 2015 18:50:30 +0000 (20:50 +0200)
modules/access/udp.c

index 1a176297bff204c9c0062062237484ec19cbc06c..3ba94bd5a037558813a25033ceb0613019735dc9 100644 (file)
@@ -252,30 +252,27 @@ static void* ThreadRead( void *data )
 
     for( ;; )
     {
-        block_t *pkt;
-        ssize_t len;
-
-        block_FifoPace( sys->fifo, SIZE_MAX, sys->fifo_size );
-
-        pkt = block_Alloc( MTU );
-        if( unlikely( pkt == NULL ) )
+        block_t *pkt = block_Alloc(MTU);
+        if (unlikely(pkt == NULL))
             break;
 
-        block_cleanup_push( pkt );
-        len = net_Read( access, sys->fd, NULL, pkt->p_buffer, MTU, false );
+        ssize_t len;
+
+        block_cleanup_push(pkt);
+        do
+            len = net_Read(access, sys->fd, NULL, pkt->p_buffer, MTU, false);
+        while (len == -1 && errno != EINTR);
         vlc_cleanup_pop();
 
-        if( len == -1 )
+        if (len == -1)
         {
-            block_Release( pkt );
-
-            if( errno == EINTR )
-                break;
-            continue;
+            block_Release(pkt);
+            break;
         }
 
         pkt->i_buffer = len;
-        block_FifoPut( sys->fifo, pkt );
+        block_FifoPace(sys->fifo, SIZE_MAX, sys->fifo_size - len);
+        block_FifoPut(sys->fifo, pkt);
     }
 
     block_FifoWake( sys->fifo );