summaryrefslogtreecommitdiff
path: root/src/pulsecore/protocol-esound.c
diff options
context:
space:
mode:
authorDavid Henningsson <david.henningsson@canonical.com>2013-06-24 17:29:26 +0200
committerTanu Kaskinen <tanu.kaskinen@linux.intel.com>2013-06-24 22:11:40 +0300
commit8127f8f9c55fe4aa7c1d330beb406fa4100b478c (patch)
tree98f0a9d8733fbc2536c00dafeb47ca676a1ce8f4 /src/pulsecore/protocol-esound.c
parent97da92d894c2a29bc3ccf60dc904e4099b30f47e (diff)
downloadpulseaudio-8127f8f9c55fe4aa7c1d330beb406fa4100b478c.tar.gz
protocol-esound/http/simple: Make sure callers can handle iochannel_write changes
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>
Diffstat (limited to 'src/pulsecore/protocol-esound.c')
-rw-r--r--src/pulsecore/protocol-esound.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/pulsecore/protocol-esound.c b/src/pulsecore/protocol-esound.c
index ff4afc6df..9509604eb 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;