[vlc-commits] network: use vlc_write_i11e() in net_Write() and simplify

Rémi Denis-Courmont git at videolan.org
Wed Jul 1 18:22:12 CEST 2015


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Tue Jun 30 23:52:51 2015 +0300| [4b865c6646df91695e984847350103ca9f053edb] | committer: Rémi Denis-Courmont

network: use vlc_write_i11e() in net_Write() and simplify

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=4b865c6646df91695e984847350103ca9f053edb
---

 src/network/io.c |   75 +++++++++++++++---------------------------------------
 1 file changed, 21 insertions(+), 54 deletions(-)

diff --git a/src/network/io.c b/src/network/io.c
index 1d287cc..a8e259e 100644
--- a/src/network/io.c
+++ b/src/network/io.c
@@ -48,6 +48,7 @@
 #endif
 
 #include <vlc_network.h>
+#include <vlc_interrupt.h>
 
 #ifndef INADDR_ANY
 #   define INADDR_ANY  0x00000000
@@ -337,7 +338,6 @@ error:
     return -1;
 }
 
-#undef net_Write
 /**
  * Writes data to a socket.
  * This blocks until all data is written or an error occurs.
@@ -347,73 +347,40 @@ error:
  * @return the total number of bytes written, or -1 if an error occurs
  * before any data is written.
  */
-ssize_t net_Write( vlc_object_t *p_this, int fd,
-                   const void *restrict p_data, size_t i_data )
+ssize_t (net_Write)(vlc_object_t *obj, int fd, const void *buf, size_t len)
 {
-    size_t i_total = 0;
-    struct pollfd ufd[2] = {
-        { .fd = fd,                           .events = POLLOUT },
-        { .fd = vlc_object_waitpipe (p_this), .events = POLLIN  },
-    };
-
-    if (unlikely(ufd[1].fd == -1))
-    {
-        vlc_testcancel ();
-        return -1;
-    }
+    size_t written = 0;
 
-    while( i_data > 0 )
+    do
     {
-        ufd[0].revents = ufd[1].revents = 0;
-
-        if (poll (ufd, sizeof (ufd) / sizeof (ufd[0]), -1) == -1)
+        if (!vlc_object_alive(obj))
         {
-            if (errno == EINTR)
-                continue;
-            msg_Err (p_this, "Polling error: %s", vlc_strerror_c(errno));
+            vlc_testcancel();
+            errno = EINTR;
             return -1;
         }
 
-        if (i_total > 0)
-        {   /* If POLLHUP resp. POLLERR|POLLNVAL occurs while we have already
-             * read some data, it is important that we first return the number
-             * of bytes read, and then return 0 resp. -1 on the NEXT call. */
-            if (ufd[0].revents & (POLLHUP|POLLERR|POLLNVAL))
-                break;
-            if (ufd[1].revents) /* VLC object signaled */
-                break;
-        }
-        else
-        {
-            if (ufd[1].revents)
-            {
-                errno = EINTR;
-                goto error;
-            }
-        }
-
-        ssize_t val = send (fd, p_data, i_data, MSG_NOSIGNAL);
+        ssize_t val = vlc_send_i11e (fd, buf, len, MSG_NOSIGNAL);
         if (val == -1)
         {
-            if (errno == EINTR)
+            if (errno == EINTR || errno == EAGAIN)
                 continue;
-            msg_Err (p_this, "Write error: %s", vlc_strerror_c(errno));
-            break;
-        }
 
-        p_data = (const char *)p_data + val;
-        i_data -= val;
-        i_total += val;
-    }
+            msg_Err(obj, "write error: %s", vlc_strerror_c(errno));
+            return written ? (ssize_t)written : -1;
+        }
 
-    if (unlikely(i_data == 0))
-        vlc_testcancel (); /* corner case */
+        if (val == 0)
+            break;
 
-    if ((i_total > 0) || (i_data == 0))
-        return i_total;
+        written += val;
+        assert(len >= (size_t)val);
+        len -= val;
+        buf = ((const char *)buf) + val;
+    }
+    while (len > 0);
 
-error:
-    return -1;
+    return written;
 }
 
 #undef net_Gets



More information about the vlc-commits mailing list