cancel pending defers

This commit is contained in:
Wim Taymans 2016-10-20 19:36:26 +02:00
parent 8fac22afdb
commit 9b2b4b9b5c
5 changed files with 16 additions and 2 deletions

View file

@ -844,6 +844,7 @@ static void
pinos_link_dispose (GObject * object) pinos_link_dispose (GObject * object)
{ {
PinosLink *this = PINOS_LINK (object); PinosLink *this = PINOS_LINK (object);
PinosLinkPrivate *priv = this->priv;
g_debug ("link %p: dispose", this); g_debug ("link %p: dispose", this);
@ -878,6 +879,8 @@ pinos_link_dispose (GObject * object)
} }
link_unregister_object (this); link_unregister_object (this);
pinos_main_loop_defer_cancel (priv->main_loop, this, 0);
G_OBJECT_CLASS (pinos_link_parent_class)->dispose (object); G_OBJECT_CLASS (pinos_link_parent_class)->dispose (object);
} }

View file

@ -267,20 +267,26 @@ pinos_main_loop_defer (PinosMainLoop *loop,
void void
pinos_main_loop_defer_cancel (PinosMainLoop *loop, pinos_main_loop_defer_cancel (PinosMainLoop *loop,
gpointer obj,
gulong id) gulong id)
{ {
GList *walk; GList *walk;
PinosMainLoopPrivate *priv; PinosMainLoopPrivate *priv;
gboolean have_work = FALSE;
g_return_if_fail (PINOS_IS_MAIN_LOOP (loop)); g_return_if_fail (PINOS_IS_MAIN_LOOP (loop));
priv = loop->priv; priv = loop->priv;
for (walk = priv->work.head; walk; walk = g_list_next (walk)) { for (walk = priv->work.head; walk; walk = g_list_next (walk)) {
WorkItem *i = walk->data; 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; 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 void

View file

@ -78,6 +78,7 @@ gulong pinos_main_loop_defer (PinosMainLoop *loo
gpointer data, gpointer data,
GDestroyNotify notify); GDestroyNotify notify);
void pinos_main_loop_defer_cancel (PinosMainLoop *loop, void pinos_main_loop_defer_cancel (PinosMainLoop *loop,
gpointer obj,
gulong id); gulong id);
void pinos_main_loop_defer_complete (PinosMainLoop *loop, void pinos_main_loop_defer_complete (PinosMainLoop *loop,
gpointer obj, gpointer obj,

View file

@ -759,13 +759,15 @@ static void
pinos_node_dispose (GObject * obj) pinos_node_dispose (GObject * obj)
{ {
PinosNode *node = PINOS_NODE (obj); PinosNode *node = PINOS_NODE (obj);
//PinosNodePrivate *priv = node->priv; PinosNodePrivate *priv = node->priv;
g_debug ("node %p: dispose", node); g_debug ("node %p: dispose", node);
pinos_node_set_state (node, PINOS_NODE_STATE_SUSPENDED); pinos_node_set_state (node, PINOS_NODE_STATE_SUSPENDED);
node_unregister_object (node); node_unregister_object (node);
pinos_main_loop_defer_cancel (priv->main_loop, node, 0);
G_OBJECT_CLASS (pinos_node_parent_class)->dispose (obj); G_OBJECT_CLASS (pinos_node_parent_class)->dispose (obj);
} }

View file

@ -154,6 +154,7 @@ spa_ringbuffer_read_advance (SpaRingbuffer *rbuf,
ssize_t len) ssize_t len)
{ {
size_t tmp = rbuf->readindex + len; size_t tmp = rbuf->readindex + len;
__sync_synchronize();
rbuf->readindex = (rbuf->size_mask ? tmp & rbuf->size_mask : tmp % rbuf->size); 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) ssize_t len)
{ {
size_t tmp = rbuf->writeindex + len; size_t tmp = rbuf->writeindex + len;
__sync_synchronize();
rbuf->writeindex = (rbuf->size_mask ? tmp & rbuf->size_mask : tmp % rbuf->size); rbuf->writeindex = (rbuf->size_mask ? tmp & rbuf->size_mask : tmp % rbuf->size);
} }