diff options
author | Wim Taymans <wtaymans@redhat.com> | 2020-09-09 13:49:09 +0200 |
---|---|---|
committer | Wim Taymans <wtaymans@redhat.com> | 2020-09-09 13:49:09 +0200 |
commit | 8638fd0411ae58dcc0436e6eb6bcd0236749f5b3 (patch) | |
tree | b6a6c961228912c21960fb8ef52eb41e9e3386ca /pipewire-pulseaudio | |
parent | af646667167e27c901a29d7af863a7038f873451 (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.c | 13 |
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 = { |