]> code.delx.au - pulseaudio/blobdiff - src/pulse/operation.c
format: Add some error logging
[pulseaudio] / src / pulse / operation.c
index aa2bbc05d2078ca9a65cf19e5c41ba3e7e269b57..917a8a9581a4b6443b615150abbf0af28567e9ba 100644 (file)
@@ -5,7 +5,7 @@
 
   PulseAudio is free software; you can redistribute it and/or modify
   it under the terms of the GNU Lesser General Public License as published
 
   PulseAudio is free software; you can redistribute it and/or modify
   it under the terms of the GNU Lesser General Public License as published
-  by the Free Software Foundation; either version 2 of the License,
+  by the Free Software Foundation; either version 2.1 of the License,
   or (at your option) any later version.
 
   PulseAudio is distributed in the hope that it will be useful, but
   or (at your option) any later version.
 
   PulseAudio is distributed in the hope that it will be useful, but
@@ -26,6 +26,7 @@
 #include <pulse/xmalloc.h>
 #include <pulsecore/macro.h>
 #include <pulsecore/flist.h>
 #include <pulse/xmalloc.h>
 #include <pulsecore/macro.h>
 #include <pulsecore/flist.h>
+#include <pulse/fork-detect.h>
 
 #include "internal.h"
 #include "operation.h"
 
 #include "internal.h"
 #include "operation.h"
@@ -39,10 +40,11 @@ pa_operation *pa_operation_new(pa_context *c, pa_stream *s, pa_operation_cb_t cb
     if (!(o = pa_flist_pop(PA_STATIC_FLIST_GET(operations))))
         o = pa_xnew(pa_operation, 1);
 
     if (!(o = pa_flist_pop(PA_STATIC_FLIST_GET(operations))))
         o = pa_xnew(pa_operation, 1);
 
+    pa_zero(*o);
+
     PA_REFCNT_INIT(o);
     o->context = c;
     o->stream = s;
     PA_REFCNT_INIT(o);
     o->context = c;
     o->stream = s;
-    o->private = NULL;
 
     o->state = PA_OPERATION_RUNNING;
     o->callback = cb;
 
     o->state = PA_OPERATION_RUNNING;
     o->callback = cb;
@@ -91,6 +93,8 @@ static void operation_unlink(pa_operation *o) {
     o->stream = NULL;
     o->callback = NULL;
     o->userdata = NULL;
     o->stream = NULL;
     o->callback = NULL;
     o->userdata = NULL;
+    o->state_callback = NULL;
+    o->state_userdata = NULL;
 }
 
 static void operation_set_state(pa_operation *o, pa_operation_state_t st) {
 }
 
 static void operation_set_state(pa_operation *o, pa_operation_state_t st) {
@@ -104,6 +108,9 @@ static void operation_set_state(pa_operation *o, pa_operation_state_t st) {
 
     o->state = st;
 
 
     o->state = st;
 
+    if (o->state_callback)
+        o->state_callback(o, o->state_userdata);
+
     if ((o->state == PA_OPERATION_DONE) || (o->state == PA_OPERATION_CANCELED))
         operation_unlink(o);
 
     if ((o->state == PA_OPERATION_DONE) || (o->state == PA_OPERATION_CANCELED))
         operation_unlink(o);
 
@@ -130,3 +137,17 @@ pa_operation_state_t pa_operation_get_state(pa_operation *o) {
 
     return o->state;
 }
 
     return o->state;
 }
+
+void pa_operation_set_state_callback(pa_operation *o, pa_operation_notify_cb_t cb, void *userdata) {
+    pa_assert(o);
+    pa_assert(PA_REFCNT_VALUE(o) >= 1);
+
+    if (pa_detect_fork())
+        return;
+
+    if (o->state == PA_OPERATION_DONE || o->state == PA_OPERATION_CANCELED)
+        return;
+
+    o->state_callback = cb;
+    o->state_userdata = userdata;
+}