From fb0919b8b78d58669779b966dbc352a24f9a6364 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 2 May 2017 12:02:27 +0200 Subject: [PATCH] link: improve state changes --- pinos/server/link.c | 4 ++++ pinos/server/node.c | 5 ++--- pinos/server/work-queue.c | 19 ++++++++++++++----- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/pinos/server/link.c b/pinos/server/link.c index 29f43f5e7..3aa55fc72 100644 --- a/pinos/server/link.c +++ b/pinos/server/link.c @@ -663,6 +663,10 @@ check_states (PinosLink *this, in_state = this->input->state; out_state = this->output->state; + if (in_state == PINOS_PORT_STATE_STREAMING && + out_state == PINOS_PORT_STATE_STREAMING) + return SPA_RESULT_OK; + pinos_log_debug ("link %p: input state %d, output state %d", this, in_state, out_state); if ((res = do_negotiate (this, in_state, out_state)) != SPA_RESULT_OK) diff --git a/pinos/server/node.c b/pinos/server/node.c index 4192e9f91..b4c19af8c 100644 --- a/pinos/server/node.c +++ b/pinos/server/node.c @@ -323,9 +323,8 @@ on_node_event (SpaNode *node, SpaEvent *event, void *user_data) SpaEventNodeAsyncComplete *ac = (SpaEventNodeAsyncComplete *) event; pinos_log_debug ("node %p: async complete event %d %d", this, ac->body.seq.value, ac->body.res.value); - if (!pinos_work_queue_complete (impl->work, this, ac->body.seq.value, ac->body.res.value)) { - pinos_signal_emit (&this->async_complete, this, ac->body.seq.value, ac->body.res.value); - } + pinos_work_queue_complete (impl->work, this, ac->body.seq.value, ac->body.res.value); + pinos_signal_emit (&this->async_complete, this, ac->body.seq.value, ac->body.res.value); } else if (SPA_EVENT_TYPE (event) == this->core->type.event_node.NeedInput) { do_pull (this); diff --git a/pinos/server/work-queue.c b/pinos/server/work-queue.c index 39257a078..9ef6b904f 100644 --- a/pinos/server/work-queue.c +++ b/pinos/server/work-queue.c @@ -44,6 +44,7 @@ typedef struct SpaList work_list; SpaList free_list; + int n_queued; } PinosWorkQueueImpl; @@ -58,19 +59,23 @@ process_work_queue (SpaLoopUtils *utils, spa_list_for_each_safe (item, tmp, &impl->work_list, link) { if (item->seq != SPA_ID_INVALID) { - pinos_log_debug ("work-queue %p: waiting for item %p %d", this, item->obj, item->seq); + pinos_log_debug ("work-queue %p: %d waiting for item %p %d", this, impl->n_queued, + item->obj, item->seq); continue; } if (item->res == SPA_RESULT_WAIT_SYNC && item != spa_list_first (&impl->work_list, WorkItem, link)) { - pinos_log_debug ("work-queue %p: sync item %p not head", this, item->obj); + pinos_log_debug ("work-queue %p: %d sync item %p not head", this, impl->n_queued, + item->obj); continue; } spa_list_remove (&item->link); + impl->n_queued--; if (item->func) { - pinos_log_debug ("work-queue %p: process work item %p %d %d", this, item->obj, item->seq, item->res); + pinos_log_debug ("work-queue %p: %d process work item %p %d %d", this, impl->n_queued, + item->obj, item->seq, item->res); item->func (item->obj, item->data, item->res, item->id); } spa_list_insert (impl->free_list.prev, &item->link); @@ -118,9 +123,12 @@ pinos_work_queue_destroy (PinosWorkQueue * queue) pinos_loop_destroy_source (queue->loop, impl->wakeup); - spa_list_for_each_safe (item, tmp, &impl->free_list, link) + spa_list_for_each_safe (item, tmp, &impl->work_list, link) { + pinos_log_warn ("work-queue %p: cancel work item %p %d %d", queue, + item->obj, item->seq, item->res); free (item); - spa_list_for_each_safe (item, tmp, &impl->work_list, link) + } + spa_list_for_each_safe (item, tmp, &impl->free_list, link) free (item); free (impl); @@ -166,6 +174,7 @@ pinos_work_queue_add (PinosWorkQueue *queue, pinos_log_debug ("work-queue %p: defer object %p", queue, obj); } spa_list_insert (impl->work_list.prev, &item->link); + impl->n_queued++; if (have_work) pinos_loop_signal_event (impl->this.loop, impl->wakeup);