]> code.delx.au - pulseaudio/commitdiff
pstream: Fixup hangs caused by recent iochannel patch
authorDavid Henningsson <david.henningsson@canonical.com>
Mon, 17 Jun 2013 06:52:07 +0000 (08:52 +0200)
committerDavid Henningsson <david.henningsson@canonical.com>
Mon, 17 Jun 2013 06:52:07 +0000 (08:52 +0200)
Now that we don't *always* get a callback after having written
something, make sure we can continue writing as long as it fully
succeeds.

Signed-off-by: David Henningsson <david.henningsson@canonical.com>
src/pulsecore/pstream.c

index 9463437a747a487afd994478b93ffea81ebe4d11..6cf4394c3b2ea49f5fc89e2cfbd19861e985abd5 100644 (file)
@@ -187,9 +187,12 @@ static void do_pstream_read_write(pa_pstream *p) {
     } else if (!p->dead && pa_iochannel_is_hungup(p->io))
         goto fail;
 
-    if (!p->dead && pa_iochannel_is_writable(p->io)) {
-        if (do_write(p) < 0)
+    while (!p->dead && pa_iochannel_is_writable(p->io)) {
+        int r = do_write(p);
+        if (r < 0)
             goto fail;
+        if (r == 0)
+            break;
     }
 
     pa_pstream_unref(p);
@@ -634,7 +637,7 @@ static int do_write(pa_pstream *p) {
             p->drain_callback(p, p->drain_callback_userdata);
     }
 
-    return 0;
+    return (size_t) r == l ? 1 : 0;
 
 fail: