diff --git a/pinos/server/link.c b/pinos/server/link.c index 0507d87c8..861539699 100644 --- a/pinos/server/link.c +++ b/pinos/server/link.c @@ -844,6 +844,7 @@ static void pinos_link_dispose (GObject * object) { PinosLink *this = PINOS_LINK (object); + PinosLinkPrivate *priv = this->priv; g_debug ("link %p: dispose", this); @@ -878,6 +879,8 @@ pinos_link_dispose (GObject * object) } link_unregister_object (this); + pinos_main_loop_defer_cancel (priv->main_loop, this, 0); + G_OBJECT_CLASS (pinos_link_parent_class)->dispose (object); } diff --git a/pinos/server/main-loop.c b/pinos/server/main-loop.c index bc23cb7f3..6d7a674b4 100644 --- a/pinos/server/main-loop.c +++ b/pinos/server/main-loop.c @@ -267,20 +267,26 @@ pinos_main_loop_defer (PinosMainLoop *loop, void pinos_main_loop_defer_cancel (PinosMainLoop *loop, + gpointer obj, gulong id) { GList *walk; PinosMainLoopPrivate *priv; + gboolean have_work = FALSE; g_return_if_fail (PINOS_IS_MAIN_LOOP (loop)); priv = loop->priv; for (walk = priv->work.head; walk; walk = g_list_next (walk)) { WorkItem *i = walk->data; - if (i->id == id) { + if ((id == 0 || i->id == id) && (obj == NULL || i->obj == obj)) { + i->seq = SPA_ID_INVALID; i->func = NULL; + have_work = TRUE; } } + if (priv->work_id == 0 && have_work) + priv->work_id = g_idle_add ((GSourceFunc) process_work_queue, loop); } void diff --git a/pinos/server/main-loop.h b/pinos/server/main-loop.h index a5ef45052..6d9b732e0 100644 --- a/pinos/server/main-loop.h +++ b/pinos/server/main-loop.h @@ -78,6 +78,7 @@ gulong pinos_main_loop_defer (PinosMainLoop *loo gpointer data, GDestroyNotify notify); void pinos_main_loop_defer_cancel (PinosMainLoop *loop, + gpointer obj, gulong id); void pinos_main_loop_defer_complete (PinosMainLoop *loop, gpointer obj, diff --git a/pinos/server/node.c b/pinos/server/node.c index bd4222260..5f9e6fe28 100644 --- a/pinos/server/node.c +++ b/pinos/server/node.c @@ -759,13 +759,15 @@ static void pinos_node_dispose (GObject * obj) { PinosNode *node = PINOS_NODE (obj); - //PinosNodePrivate *priv = node->priv; + PinosNodePrivate *priv = node->priv; g_debug ("node %p: dispose", node); pinos_node_set_state (node, PINOS_NODE_STATE_SUSPENDED); node_unregister_object (node); + pinos_main_loop_defer_cancel (priv->main_loop, node, 0); + G_OBJECT_CLASS (pinos_node_parent_class)->dispose (obj); } diff --git a/spa/include/spa/ringbuffer.h b/spa/include/spa/ringbuffer.h index 14555edfd..0e58a16fd 100644 --- a/spa/include/spa/ringbuffer.h +++ b/spa/include/spa/ringbuffer.h @@ -154,6 +154,7 @@ spa_ringbuffer_read_advance (SpaRingbuffer *rbuf, ssize_t len) { size_t tmp = rbuf->readindex + len; + __sync_synchronize(); rbuf->readindex = (rbuf->size_mask ? tmp & rbuf->size_mask : tmp % rbuf->size); } @@ -232,6 +233,7 @@ spa_ringbuffer_write_advance (SpaRingbuffer *rbuf, ssize_t len) { size_t tmp = rbuf->writeindex + len; + __sync_synchronize(); rbuf->writeindex = (rbuf->size_mask ? tmp & rbuf->size_mask : tmp % rbuf->size); }