protocol-esound/http/simple: Make sure callers can handle iochannel_write changes
authorDavid Henningsson <david.henningsson@canonical.com>
Mon, 24 Jun 2013 15:29:26 +0000 (17:29 +0200)
committerTanu Kaskinen <tanu.kaskinen@linux.intel.com>
Mon, 24 Jun 2013 19:11:40 +0000 (22:11 +0300)
With the new behaviour, you will not always get a callback after a
successful write. Make sure the callers can properly handle this.

Signed-off-by: David Henningsson <david.henningsson@canonical.com>
src/pulsecore/protocol-esound.c
src/pulsecore/protocol-http.c
src/pulsecore/protocol-simple.c

index ff4afc6df7d4709a575c486a05c8b55e62917b97..9509604eb518f44e9e73e733ec9209288e8fd72a 100644 (file)
@@ -1196,10 +1196,6 @@ static int do_write(connection *c) {
 
         pa_assert(c->write_data_index < c->write_data_length);
         if ((r = pa_iochannel_write(c->io, (uint8_t*) c->write_data+c->write_data_index, c->write_data_length-c->write_data_index)) < 0) {
-
-            if (r < 0 && (errno == EINTR || errno == EAGAIN))
-                return 0;
-
             pa_log("write(): %s", pa_cstrerror(errno));
             return -1;
         }
@@ -1208,6 +1204,8 @@ static int do_write(connection *c) {
         if (c->write_data_index >= c->write_data_length)
             c->write_data_length = c->write_data_index = 0;
 
+        return 1;
+
     } else if (c->state == ESD_STREAMING_DATA && c->source_output) {
         pa_memchunk chunk;
         ssize_t r;
@@ -1231,6 +1229,7 @@ static int do_write(connection *c) {
         }
 
         pa_memblockq_drop(c->output_memblockq, (size_t) r);
+        return 1;
     }
 
     return 0;
@@ -1254,9 +1253,13 @@ static void do_work(connection *c) {
          * here, instead of simply waiting for read() to return 0. */
         goto fail;
 
-    if (pa_iochannel_is_writable(c->io))
-        if (do_write(c) < 0)
+    while (pa_iochannel_is_writable(c->io)) {
+        int r = do_write(c);
+        if (r < 0)
             goto fail;
+        if (r == 0)
+            break;
+    }
 
     return;
 
index 1dcf01071d394a93bb03139aebc1a7427ab5fdeb..7d49bf822284a89cdd37b6d3a9604fab2bcfdb2a 100644 (file)
@@ -168,7 +168,7 @@ static int do_write(struct connection *c) {
 
     pa_memblockq_drop(c->output_memblockq, (size_t) r);
 
-    return 0;
+    return 1;
 }
 
 /* Called from main context */
@@ -178,9 +178,13 @@ static void do_work(struct connection *c) {
     if (pa_iochannel_is_hungup(c->io))
         goto fail;
 
-    if (pa_iochannel_is_writable(c->io))
-        if (do_write(c) < 0)
+    while (pa_iochannel_is_writable(c->io)) {
+        int r = do_write(c);
+        if (r < 0)
             goto fail;
+        if (r == 0)
+            break;
+    }
 
     return;
 
index 0e7c6e0a7246c23d7d3dde8017eb872d6b40665c..14eb5663fb54afd09e71f0301f55d395617c6c7b 100644 (file)
@@ -235,7 +235,7 @@ static int do_write(connection *c) {
 
     pa_memblockq_drop(c->output_memblockq, (size_t) r);
 
-    return 0;
+    return 1;
 }
 
 static void do_work(connection *c) {
@@ -251,9 +251,13 @@ static void do_work(connection *c) {
     if (!c->sink_input && pa_iochannel_is_hungup(c->io))
         goto fail;
 
-    if (pa_iochannel_is_writable(c->io))
-        if (do_write(c) < 0)
+    while (pa_iochannel_is_writable(c->io)) {
+        int r = do_write(c);
+        if (r < 0)
             goto fail;
+        if (r == 0)
+            break;
+    }
 
     return;