[pulseaudio-discuss] [PATCH] protocol-esound/http/simple: Make sure callers can handle iochannel_write changes

David Henningsson david.henningsson at canonical.com
Mon Jun 24 08:29:26 PDT 2013


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 at canonical.com>
---
 src/pulsecore/protocol-esound.c |   15 +++++++++------
 src/pulsecore/protocol-http.c   |   10 +++++++---
 src/pulsecore/protocol-simple.c |   10 +++++++---
 3 files changed, 23 insertions(+), 12 deletions(-)

Hmm, I thought I sent this out for review a week ago, but apparently
I missed it. Anyway it fixes the iochannel regression for the less common
protocols - hopefully, I haven't tested it, just wrote by looking at code.

diff --git a/src/pulsecore/protocol-esound.c b/src/pulsecore/protocol-esound.c
index ff4afc6..9509604 100644
--- a/src/pulsecore/protocol-esound.c
+++ b/src/pulsecore/protocol-esound.c
@@ -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;
 
diff --git a/src/pulsecore/protocol-http.c b/src/pulsecore/protocol-http.c
index 52571d3..6d85518 100644
--- a/src/pulsecore/protocol-http.c
+++ b/src/pulsecore/protocol-http.c
@@ -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;
 
diff --git a/src/pulsecore/protocol-simple.c b/src/pulsecore/protocol-simple.c
index 0e7c6e0..14eb566 100644
--- a/src/pulsecore/protocol-simple.c
+++ b/src/pulsecore/protocol-simple.c
@@ -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;
 
-- 
1.7.9.5



More information about the pulseaudio-discuss mailing list