]> git.tuebingen.mpg.de Git - paraslash.git/commitdiff
Merge /home/maan/scm/paraslash_fml/paraslash
authorAndre Noll <maan@systemlinux.org>
Mon, 6 Aug 2007 18:47:27 +0000 (20:47 +0200)
committerAndre Noll <maan@systemlinux.org>
Mon, 6 Aug 2007 18:47:27 +0000 (20:47 +0200)
NEWS
dccp_send.c

diff --git a/NEWS b/NEWS
index 03045da35142786314bde298a53903fb9807f0fb..33c17e1ee535d81a03fde065597d3152177de8c7 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -15,6 +15,8 @@ the 0.2.x series if no serious bugs show up after the release.
        - update to gengetopt-2.20.
        - autoconf: extend checks for headers, library functions and
          compiler characteristics.
+       - dccp sender: Keep polling until an entry becomes free if write()
+         returns EAGAIN (Gerrit Renker).
 
 --------------------------------------
 0.2.16 (2007-04-05) "neural discharge"
index 27343fbc0874e96865880eaa5866d1e65a1fa385..bdc7681e1de02469daaa0bc10698514eac563583 100644 (file)
@@ -108,31 +108,26 @@ static void dccp_shutdown_client(struct dccp_client *dc)
        free(dc);
 }
 
-/** give up if write would block that many times */
-#define DCCP_WRITE_RETRIES 100
-
 static int dccp_write(int fd, const char *buf, size_t len)
 {
-       size_t size, written = 0;
-       int ret, retries = 0;
-again:
-       size = PARA_MIN(1024, len - written);
-       ret = write(fd, buf + written, size);
-       if (ret < 0) {
-               if (errno != EAGAIN || retries++ > DCCP_WRITE_RETRIES)
-                       goto err_out;
-               PARA_DEBUG_LOG("EAGAIN #%d@%zd/%zd\n", retries, written, len);
-               goto again;
+       size_t written = 0;
+       int ret = 0;
+
+       while (written < len) {
+               ret = write(fd, buf + written, PARA_MIN(1024, len - written));
+               /*
+                * Error handling: CCID3 has a sending wait queue which fills up and is
+                * emptied asynchronously. The EAGAIN case means that there is currently
+                * no space in the wait queue, but this can change at any moment and is
+                * thus not an error condition. Keep polling until an entry becomes free.
+                */
+               if (ret < 0 && errno == EAGAIN)
+                       continue;
+               if (ret < 0)
+                       return -E_DCCP_WRITE;
+               written += ret;
        }
-       retries = 0;
-       written += ret;
-       if (written >= len)
-               return written;
-       ret = write_ok(fd);
-       if (ret > 0)
-               goto again;
-err_out:
-       return -E_DCCP_WRITE;
+       return written;
 }
 
 static void dccp_send(long unsigned current_chunk,