]> code.delx.au - pulseaudio/commitdiff
ioline: add new calls pa_ioline_detach_iochannel() and pa_ioline_is_drained()
authorLennart Poettering <lennart@poettering.net>
Wed, 29 Apr 2009 02:14:52 +0000 (04:14 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 29 Apr 2009 02:14:52 +0000 (04:14 +0200)
src/pulsecore/ioline.c
src/pulsecore/ioline.h

index 7f252bc46f7be6a4dcf78ae00df389dad72c5e05..7afdb08cc719b7cad9de599c9943ea82af187e03 100644 (file)
@@ -283,7 +283,7 @@ static int do_read(pa_ioline *l) {
     pa_assert(l);
     pa_assert(PA_REFCNT_VALUE(l) >= 1);
 
-    while (!l->dead && pa_iochannel_is_readable(l->io)) {
+    while (l->io && !l->dead && pa_iochannel_is_readable(l->io)) {
         ssize_t r;
         size_t len;
 
@@ -348,7 +348,7 @@ static int do_write(pa_ioline *l) {
     pa_assert(l);
     pa_assert(PA_REFCNT_VALUE(l) >= 1);
 
-    while (!l->dead && pa_iochannel_is_writable(l->io) && l->wbuf_valid_length) {
+    while (l->io && !l->dead && pa_iochannel_is_writable(l->io) && l->wbuf_valid_length > 0) {
 
         if ((r = pa_iochannel_write(l->io, l->wbuf+l->wbuf_index, l->wbuf_valid_length)) <= 0) {
 
@@ -443,3 +443,25 @@ void pa_ioline_printf(pa_ioline *l, const char *format, ...) {
     pa_ioline_puts(l, t);
     pa_xfree(t);
 }
+
+pa_iochannel* pa_ioline_detach_iochannel(pa_ioline *l) {
+    pa_iochannel *r;
+
+    pa_assert(l);
+
+    if (!l->io)
+        return NULL;
+
+    r = l->io;
+    l->io = NULL;
+
+    pa_iochannel_set_callback(r, NULL, NULL);
+
+    return r;
+}
+
+pa_bool_t pa_ioline_is_drained(pa_ioline *l) {
+    pa_assert(l);
+
+    return l->wbuf_valid_length <= 0;
+}
index 26e2a22c1819e59eb73cdd6a9f65e985bbc271e6..d973a3c7363764db96a6b1146572aacdae217f62 100644 (file)
@@ -54,4 +54,11 @@ void pa_ioline_set_drain_callback(pa_ioline*io, pa_ioline_drain_cb_t callback, v
 /* Make sure to close the ioline object as soon as the send buffer is emptied */
 void pa_ioline_defer_close(pa_ioline *io);
 
+/* Returns TRUE when everything was written */
+pa_bool_t pa_ioline_is_drained(pa_ioline *io);
+
+/* Detaches from the iochannel and returns it. Data that has already
+ * been read will not be available in the detached iochannel */
+pa_iochannel* pa_ioline_detach_iochannel(pa_ioline *l);
+
 #endif