mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	media-session: improve shutdown
First emit a remove of all objects. Then signal a session destroy and then destroy the context.
This commit is contained in:
		
							parent
							
								
									24ab22db12
								
							
						
					
					
						commit
						686a5cf47e
					
				
					 3 changed files with 22 additions and 5 deletions
				
			
		| 
						 | 
					@ -405,6 +405,7 @@ static void proxy_destroy(void *data)
 | 
				
			||||||
	spa_list_remove(&endpoint->link);
 | 
						spa_list_remove(&endpoint->link);
 | 
				
			||||||
	spa_hook_remove(&endpoint->proxy_listener);
 | 
						spa_hook_remove(&endpoint->proxy_listener);
 | 
				
			||||||
	spa_hook_remove(&endpoint->client_endpoint_listener);
 | 
						spa_hook_remove(&endpoint->client_endpoint_listener);
 | 
				
			||||||
 | 
						endpoint->client_endpoint = NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void proxy_bound(void *data, uint32_t id)
 | 
					static void proxy_bound(void *data, uint32_t id)
 | 
				
			||||||
| 
						 | 
					@ -537,6 +538,7 @@ static struct endpoint *create_endpoint(struct node *node, struct endpoint *moni
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void destroy_endpoint(struct endpoint *endpoint)
 | 
					static void destroy_endpoint(struct endpoint *endpoint)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						if (endpoint->client_endpoint)
 | 
				
			||||||
		pw_proxy_destroy((struct pw_proxy*)endpoint->client_endpoint);
 | 
							pw_proxy_destroy((struct pw_proxy*)endpoint->client_endpoint);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1672,6 +1672,16 @@ static int start_policy(struct impl *impl)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void session_shutdown(struct impl *impl)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct sm_object *obj;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						spa_list_for_each(obj, &impl->global_list, link)
 | 
				
			||||||
 | 
							sm_media_session_emit_remove(impl, obj);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sm_media_session_emit_destroy(impl);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(int argc, char *argv[])
 | 
					int main(int argc, char *argv[])
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct impl impl = { 0, };
 | 
						struct impl impl = { 0, };
 | 
				
			||||||
| 
						 | 
					@ -1714,8 +1724,9 @@ int main(int argc, char *argv[])
 | 
				
			||||||
		goto exit;
 | 
							goto exit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_main_loop_run(impl.loop);
 | 
						pw_main_loop_run(impl.loop);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exit:
 | 
					exit:
 | 
				
			||||||
	sm_media_session_emit_destroy(&impl);
 | 
						session_shutdown(&impl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_context_destroy(impl.this.context);
 | 
						pw_context_destroy(impl.this.context);
 | 
				
			||||||
	pw_main_loop_destroy(impl.loop);
 | 
						pw_main_loop_destroy(impl.loop);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -355,6 +355,7 @@ static void proxy_destroy(void *data)
 | 
				
			||||||
	spa_list_remove(&endpoint->link);
 | 
						spa_list_remove(&endpoint->link);
 | 
				
			||||||
	spa_hook_remove(&endpoint->proxy_listener);
 | 
						spa_hook_remove(&endpoint->proxy_listener);
 | 
				
			||||||
	spa_hook_remove(&endpoint->client_endpoint_listener);
 | 
						spa_hook_remove(&endpoint->client_endpoint_listener);
 | 
				
			||||||
 | 
						endpoint->client_endpoint = NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void proxy_bound(void *data, uint32_t id)
 | 
					static void proxy_bound(void *data, uint32_t id)
 | 
				
			||||||
| 
						 | 
					@ -473,7 +474,7 @@ static struct endpoint *create_endpoint(struct node *node)
 | 
				
			||||||
	return endpoint;
 | 
						return endpoint;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void destroy_endpoint(struct endpoint *endpoint)
 | 
					static void destroy_endpoint(struct impl *impl, struct endpoint *endpoint)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	pw_log_debug("endpoint %p: destroy", endpoint);
 | 
						pw_log_debug("endpoint %p: destroy", endpoint);
 | 
				
			||||||
	if (endpoint->client_endpoint) {
 | 
						if (endpoint->client_endpoint) {
 | 
				
			||||||
| 
						 | 
					@ -513,10 +514,13 @@ static int activate_device(struct device *device)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int deactivate_device(struct device *device)
 | 
					static int deactivate_device(struct device *device)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						struct impl *impl = device->impl;
 | 
				
			||||||
	struct endpoint *e;
 | 
						struct endpoint *e;
 | 
				
			||||||
	pw_log_debug("device %p: deactivate", device->device);
 | 
					
 | 
				
			||||||
 | 
						pw_log_debug(NAME" %p: device %p deactivate", impl, device->device);
 | 
				
			||||||
	spa_list_consume(e, &device->endpoint_list, link)
 | 
						spa_list_consume(e, &device->endpoint_list, link)
 | 
				
			||||||
		destroy_endpoint(e);
 | 
							destroy_endpoint(impl, e);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue