summaryrefslogtreecommitdiff
path: root/pipewire-pulseaudio
diff options
context:
space:
mode:
authorWim Taymans <wtaymans@redhat.com>2020-09-09 13:49:09 +0200
committerWim Taymans <wtaymans@redhat.com>2020-09-09 13:49:09 +0200
commit8638fd0411ae58dcc0436e6eb6bcd0236749f5b3 (patch)
treeb6a6c961228912c21960fb8ef52eb41e9e3386ca /pipewire-pulseaudio
parentaf646667167e27c901a29d7af863a7038f873451 (diff)
pulse: improve operation handling
First move all completed operations to a new list, then complete the operations and cancel the ones that are not completed correctly. This ensures that new operations from the callbacks don't get completed immediately as well.
Diffstat (limited to 'pipewire-pulseaudio')
-rw-r--r--pipewire-pulseaudio/src/context.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/pipewire-pulseaudio/src/context.c b/pipewire-pulseaudio/src/context.c
index be2e8aee..c72fba78 100644
--- a/pipewire-pulseaudio/src/context.c
+++ b/pipewire-pulseaudio/src/context.c
@@ -1432,23 +1432,34 @@ static void core_done(void *data, uint32_t id, int seq)
pa_context *c = data;
pa_operation *o, *t;
struct global *g;
+ struct spa_list ops;
pw_log_debug("done id:%u seq:%d/%d", id, seq, c->pending_seq);
if (c->pending_seq != seq)
return;
+ spa_list_init(&ops);
+ spa_list_consume(o, &c->operations, link) {
+ spa_list_remove(&o->link);
+ spa_list_append(&ops, &o->link);
+ }
spa_list_for_each(g, &c->globals, link) {
if (g->sync) {
do_global_sync(g);
g->sync = false;
}
}
- spa_list_for_each_safe(o, t, &c->operations, link) {
+ spa_list_for_each_safe(o, t, &ops, link) {
pa_operation_ref(o);
+ pw_log_debug("operation %p complete", o);
if (o->callback)
o->callback(o, o->userdata);
pa_operation_unref(o);
}
+ spa_list_consume(o, &ops, link) {
+ pw_log_warn("operation %p canceled", o);
+ pa_operation_cancel(o);
+ }
}
static const struct pw_core_events core_events = {