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.
This commit is contained in:
Wim Taymans 2020-09-09 13:49:09 +02:00
parent af64666716
commit 8638fd0411

View file

@ -1432,23 +1432,34 @@ static void core_done(void *data, uint32_t id, int seq)
pa_context *c = data; pa_context *c = data;
pa_operation *o, *t; pa_operation *o, *t;
struct global *g; struct global *g;
struct spa_list ops;
pw_log_debug("done id:%u seq:%d/%d", id, seq, c->pending_seq); pw_log_debug("done id:%u seq:%d/%d", id, seq, c->pending_seq);
if (c->pending_seq != seq) if (c->pending_seq != seq)
return; 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) { spa_list_for_each(g, &c->globals, link) {
if (g->sync) { if (g->sync) {
do_global_sync(g); do_global_sync(g);
g->sync = false; 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); pa_operation_ref(o);
pw_log_debug("operation %p complete", o);
if (o->callback) if (o->callback)
o->callback(o, o->userdata); o->callback(o, o->userdata);
pa_operation_unref(o); 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 = { static const struct pw_core_events core_events = {