mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	Do cleanup of queues
Wait for async state changes to complete
This commit is contained in:
		
							parent
							
								
									474981ddda
								
							
						
					
					
						commit
						fb69758251
					
				
					 3 changed files with 12 additions and 14 deletions
				
			
		| 
						 | 
					@ -36,7 +36,6 @@ typedef struct
 | 
				
			||||||
  int refcount;
 | 
					  int refcount;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  PinosWorkQueue *work;
 | 
					  PinosWorkQueue *work;
 | 
				
			||||||
  uint32_t seq;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SpaFormat **format_filter;
 | 
					  SpaFormat **format_filter;
 | 
				
			||||||
  PinosProperties *properties;
 | 
					  PinosProperties *properties;
 | 
				
			||||||
| 
						 | 
					@ -561,6 +560,7 @@ static SpaResult
 | 
				
			||||||
do_start (PinosLink *this, SpaNodeState in_state, SpaNodeState out_state)
 | 
					do_start (PinosLink *this, SpaNodeState in_state, SpaNodeState out_state)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  SpaResult res = SPA_RESULT_OK;
 | 
					  SpaResult res = SPA_RESULT_OK;
 | 
				
			||||||
 | 
					  PinosLinkImpl *impl = SPA_CONTAINER_OF (this, PinosLinkImpl, this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (in_state < SPA_NODE_STATE_PAUSED || out_state < SPA_NODE_STATE_PAUSED)
 | 
					  if (in_state < SPA_NODE_STATE_PAUSED || out_state < SPA_NODE_STATE_PAUSED)
 | 
				
			||||||
    return SPA_RESULT_OK;
 | 
					    return SPA_RESULT_OK;
 | 
				
			||||||
| 
						 | 
					@ -571,9 +571,11 @@ do_start (PinosLink *this, SpaNodeState in_state, SpaNodeState out_state)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (in_state == SPA_NODE_STATE_PAUSED) {
 | 
					    if (in_state == SPA_NODE_STATE_PAUSED) {
 | 
				
			||||||
      res = pinos_node_set_state (this->input->node, PINOS_NODE_STATE_RUNNING);
 | 
					      res = pinos_node_set_state (this->input->node, PINOS_NODE_STATE_RUNNING);
 | 
				
			||||||
 | 
					      pinos_work_queue_add (impl->work, this->input->node, res, NULL, NULL);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (out_state == SPA_NODE_STATE_PAUSED) {
 | 
					    if (out_state == SPA_NODE_STATE_PAUSED) {
 | 
				
			||||||
      res = pinos_node_set_state (this->output->node, PINOS_NODE_STATE_RUNNING);
 | 
					      res = pinos_node_set_state (this->output->node, PINOS_NODE_STATE_RUNNING);
 | 
				
			||||||
 | 
					      pinos_work_queue_add (impl->work, this->input->node, res, NULL, NULL);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return res;
 | 
					  return res;
 | 
				
			||||||
| 
						 | 
					@ -750,6 +752,8 @@ pinos_link_free (PinosLink *link)
 | 
				
			||||||
  pinos_log_debug ("link %p: free", link);
 | 
					  pinos_log_debug ("link %p: free", link);
 | 
				
			||||||
  pinos_signal_emit (&link->free_signal, link);
 | 
					  pinos_signal_emit (&link->free_signal, link);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pinos_work_queue_destroy (impl->work);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (impl->allocated)
 | 
					  if (impl->allocated)
 | 
				
			||||||
    pinos_memblock_free (&impl->buffer_mem);
 | 
					    pinos_memblock_free (&impl->buffer_mem);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -982,10 +986,6 @@ pinos_link_destroy (PinosLink * this)
 | 
				
			||||||
  pinos_global_destroy (this->global);
 | 
					  pinos_global_destroy (this->global);
 | 
				
			||||||
  spa_list_remove (&this->link);
 | 
					  spa_list_remove (&this->link);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  pinos_work_queue_cancel (impl->work,
 | 
					 | 
				
			||||||
                           this,
 | 
					 | 
				
			||||||
                           SPA_ID_INVALID);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  spa_list_for_each_safe (resource, tmp, &this->resource_list, link)
 | 
					  spa_list_for_each_safe (resource, tmp, &this->resource_list, link)
 | 
				
			||||||
    pinos_resource_destroy (resource);
 | 
					    pinos_resource_destroy (resource);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -996,7 +996,7 @@ pinos_link_destroy (PinosLink * this)
 | 
				
			||||||
    impl->refcount++;
 | 
					    impl->refcount++;
 | 
				
			||||||
    pinos_loop_invoke (this->input->node->data_loop->loop,
 | 
					    pinos_loop_invoke (this->input->node->data_loop->loop,
 | 
				
			||||||
                       do_link_remove,
 | 
					                       do_link_remove,
 | 
				
			||||||
                       impl->seq++,
 | 
					                       1,
 | 
				
			||||||
                       0,
 | 
					                       0,
 | 
				
			||||||
                       NULL,
 | 
					                       NULL,
 | 
				
			||||||
                       this);
 | 
					                       this);
 | 
				
			||||||
| 
						 | 
					@ -1008,7 +1008,7 @@ pinos_link_destroy (PinosLink * this)
 | 
				
			||||||
    impl->refcount++;
 | 
					    impl->refcount++;
 | 
				
			||||||
    pinos_loop_invoke (this->output->node->data_loop->loop,
 | 
					    pinos_loop_invoke (this->output->node->data_loop->loop,
 | 
				
			||||||
                       do_link_remove,
 | 
					                       do_link_remove,
 | 
				
			||||||
                       impl->seq++,
 | 
					                       2,
 | 
				
			||||||
                       0,
 | 
					                       0,
 | 
				
			||||||
                       NULL,
 | 
					                       NULL,
 | 
				
			||||||
                       this);
 | 
					                       this);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,8 +34,6 @@ typedef struct
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  PinosWorkQueue *work;
 | 
					  PinosWorkQueue *work;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  uint32_t seq;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  bool async_init;
 | 
					  bool async_init;
 | 
				
			||||||
} PinosNodeImpl;
 | 
					} PinosNodeImpl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -583,6 +581,8 @@ do_node_remove_done (SpaLoop        *loop,
 | 
				
			||||||
  pinos_log_debug ("node %p: free", this);
 | 
					  pinos_log_debug ("node %p: free", this);
 | 
				
			||||||
  pinos_signal_emit (&this->free_signal, this);
 | 
					  pinos_signal_emit (&this->free_signal, this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pinos_work_queue_destroy (impl->work);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (this->transport)
 | 
					  if (this->transport)
 | 
				
			||||||
    pinos_transport_destroy (this->transport);
 | 
					    pinos_transport_destroy (this->transport);
 | 
				
			||||||
  if (this->input_port_map)
 | 
					  if (this->input_port_map)
 | 
				
			||||||
| 
						 | 
					@ -657,16 +657,12 @@ pinos_node_destroy (PinosNode * this)
 | 
				
			||||||
  spa_list_remove (&this->link);
 | 
					  spa_list_remove (&this->link);
 | 
				
			||||||
  pinos_global_destroy (this->global);
 | 
					  pinos_global_destroy (this->global);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  pinos_work_queue_cancel (impl->work,
 | 
					 | 
				
			||||||
                           this,
 | 
					 | 
				
			||||||
                           SPA_ID_INVALID);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  spa_list_for_each_safe (resource, tmp, &this->resource_list, link)
 | 
					  spa_list_for_each_safe (resource, tmp, &this->resource_list, link)
 | 
				
			||||||
    pinos_resource_destroy (resource);
 | 
					    pinos_resource_destroy (resource);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  pinos_loop_invoke (this->data_loop->loop,
 | 
					  pinos_loop_invoke (this->data_loop->loop,
 | 
				
			||||||
                     do_node_remove,
 | 
					                     do_node_remove,
 | 
				
			||||||
                     impl->seq++,
 | 
					                     1,
 | 
				
			||||||
                     0,
 | 
					                     0,
 | 
				
			||||||
                     NULL,
 | 
					                     NULL,
 | 
				
			||||||
                     this);
 | 
					                     this);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -119,6 +119,8 @@ pinos_work_queue_destroy (PinosWorkQueue * queue)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  spa_list_for_each_safe (item, tmp, &impl->free_list, link)
 | 
					  spa_list_for_each_safe (item, tmp, &impl->free_list, link)
 | 
				
			||||||
    free (item);
 | 
					    free (item);
 | 
				
			||||||
 | 
					  spa_list_for_each_safe (item, tmp, &impl->work_list, link)
 | 
				
			||||||
 | 
					    free (item);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  free (impl);
 | 
					  free (impl);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue