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