From 8638fd0411ae58dcc0436e6eb6bcd0236749f5b3 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 9 Sep 2020 13:49:09 +0200 Subject: [PATCH] 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. --- pipewire-pulseaudio/src/context.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/pipewire-pulseaudio/src/context.c b/pipewire-pulseaudio/src/context.c index be2e8aee1..c72fba781 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 = {