]> git.sesse.net Git - vlc/commitdiff
Code factorization
authorRémi Denis-Courmont <rem@videolan.org>
Thu, 19 Oct 2006 15:27:58 +0000 (15:27 +0000)
committerRémi Denis-Courmont <rem@videolan.org>
Thu, 19 Oct 2006 15:27:58 +0000 (15:27 +0000)
configure.ac
src/network/io.c

index fa4a7ce1773efc5e68b6451baf61f7c4890eb694..a79059d964a99e71bf57896d3f1feeb060d185c6 100644 (file)
@@ -772,6 +772,7 @@ fi # end "${SYS}" != "mingw32" -a "${SYS}" != "mingwce"
 
 AC_HEADER_TIME
 
+AC_CHECK_TYPE(ssize_t, int)
 AC_SEARCH_LIBS(poll, [poll], [AC_DEFINE(HAVE_POLL, 1, [Define to 1 if the OS is usabl... err, has poll().])])
 
 dnl Check for dirent
index 14b093dfa71b8394e4a2b5ea195a99931e557c3d..e597e9e15e2637918012865848b2f5c405c5042f 100644 (file)
@@ -127,7 +127,7 @@ void net_Close (int fd)
 }
 
 
-static int
+static ssize_t
 net_ReadInner( vlc_object_t *restrict p_this, unsigned fdc, const int *fdv,
                const v_socket_t *const *restrict vsv,
                uint8_t *restrict p_buf, size_t i_buflen,
@@ -135,10 +135,10 @@ net_ReadInner( vlc_object_t *restrict p_this, unsigned fdc, const int *fdv,
 {
     size_t i_total = 0;
 
-    do
+    while (i_buflen > 0)
     {
-        unsigned int i;
-        int n, delay_ms;
+        unsigned i;
+        ssize_t n;
 #ifdef HAVE_POLL
         struct pollfd ufd[fdc];
 #else
@@ -146,21 +146,18 @@ net_ReadInner( vlc_object_t *restrict p_this, unsigned fdc, const int *fdv,
         fd_set set;
 #endif
 
-        if( i_buflen == 0 )
-            return i_total; // output buffer full
-
-        delay_ms = 500;
-        if( (wait_ms != -1) && (wait_ms < 500) )
+        int delay_ms = 500;
+        if ((wait_ms != -1) && (wait_ms < 500))
             delay_ms = wait_ms;
 
-        if( p_this->b_die )
+        if (p_this->b_die)
         {
             errno = EINTR;
             goto error;
         }
 
 #ifdef HAVE_POLL
-        memset(ufd, 0, sizeof (ufd) );
+        memset (ufd, 0, sizeof (ufd));
 
         for( i = 0; i < fdc; i++ )
         {
@@ -169,25 +166,6 @@ net_ReadInner( vlc_object_t *restrict p_this, unsigned fdc, const int *fdv,
         }
 
         n = poll( ufd, fdc, delay_ms );
-        if( n == -1 )
-            goto error;
-
-        assert( (unsigned int)n <= fdc );
-
-        for( i = 0; n > 0; i++ )
-        {
-            if( (i_total > 0) && (ufd[i].revents & POLLERR) )
-                return i_total; // error will be dequeued on next run
-
-            if( ufd[i].revents )
-            {
-                fdc = 1;
-                fdv += i;
-                vsv += i;
-                n--;
-                goto receive;
-            }
-        }
 #else
         FD_ZERO (&set);
 
@@ -209,23 +187,32 @@ net_ReadInner( vlc_object_t *restrict p_this, unsigned fdc, const int *fdv,
         n = select( maxfd + 1, &set, NULL, NULL,
                     (wait_ms == -1) ? NULL
                                   : &(struct timeval){ 0, delay_ms * 1000 } );
+#endif
         if( n == -1 )
             goto error;
 
-        for( i = 0; n > 0; i++ )
-            if( FD_ISSET (fdv[i], &set) )
-            {
-                fdc = 1;
-                fdv += i;
-                vsv += i;
-                n--;
-                goto receive;
-            }
-#endif
+        assert ((unsigned)n <= fdc);
 
-        continue;
+        if (n == 0) // timeout
+            continue;
+
+        for (i = 0;; i++)
+        {
+#ifdef HAVE_POLL
+            if ((i_total > 0) && (ufd[i].revents & POLLERR))
+                return i_total; // error will be dequeued on next run
+
+            if ((ufd[i].revents & POLLIN) == 0)
+#else
+            if (!FD_ISSET (fdv[i], &set))
+                continue;
+#endif
+            fdc = 1;
+            fdv += i;
+            vsv += i;
+            break;
+        }
 
-receive:
         if( (*vsv) != NULL )
         {
             n = (*vsv)->pf_recv( (*vsv)->p_sys, p_buf, i_buflen );
@@ -272,19 +259,16 @@ receive:
         p_buf += n;
         i_buflen -= n;
 
-        if( wait_ms == -1 )
-        {
-            if( !waitall )
-                return i_total;
-        }
-        else
+        if (!waitall)
+            return i_total;
+
+        if (wait_ms != -1)
         {
             wait_ms -= delay_ms;
+            if (wait_ms == 0)
+                return i_total; // time's up!
         }
     }
-    while( wait_ms );
-
-    return i_total; // timeout
 
 error:
     msg_Err( p_this, "Read error: %s", net_strerror (net_errno) );