[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