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)
{
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);
}

View file

@ -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

View file

@ -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,

View file

@ -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);
}

View file

@ -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);
}