mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	cancel pending defers
This commit is contained in:
		
							parent
							
								
									8fac22afdb
								
							
						
					
					
						commit
						9b2b4b9b5c
					
				
					 5 changed files with 16 additions and 2 deletions
				
			
		| 
						 | 
					@ -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);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue