mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	remove hooks from objects
Remove the hooks we installed on objects in the destroy/free event or before calling _destroy. This is not really needed but it is a nice thing to do because it calls the hook removed callbacks.
This commit is contained in:
		
							parent
							
								
									6317bc4deb
								
							
						
					
					
						commit
						1570e62635
					
				
					 19 changed files with 109 additions and 27 deletions
				
			
		| 
						 | 
					@ -79,10 +79,12 @@ static void context_unlink(pa_context *c)
 | 
				
			||||||
				PA_STREAM_FAILED : PA_STREAM_TERMINATED);
 | 
									PA_STREAM_FAILED : PA_STREAM_TERMINATED);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (c->registry) {
 | 
						if (c->registry) {
 | 
				
			||||||
 | 
							spa_hook_remove(&c->core_listener),
 | 
				
			||||||
		pw_proxy_destroy((struct pw_proxy*)c->registry);
 | 
							pw_proxy_destroy((struct pw_proxy*)c->registry);
 | 
				
			||||||
		c->registry = NULL;
 | 
							c->registry = NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (c->core) {
 | 
						if (c->core) {
 | 
				
			||||||
 | 
							spa_hook_remove(&c->core_listener);
 | 
				
			||||||
		pw_core_disconnect(c->core);
 | 
							pw_core_disconnect(c->core);
 | 
				
			||||||
		c->core = NULL;
 | 
							c->core = NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -1897,10 +1899,12 @@ void pa_context_disconnect(pa_context *c)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	c->disconnect = true;
 | 
						c->disconnect = true;
 | 
				
			||||||
	if (c->registry) {
 | 
						if (c->registry) {
 | 
				
			||||||
 | 
							spa_hook_remove(&c->registry_listener),
 | 
				
			||||||
		pw_proxy_destroy((struct pw_proxy*)c->registry);
 | 
							pw_proxy_destroy((struct pw_proxy*)c->registry);
 | 
				
			||||||
		c->registry = NULL;
 | 
							c->registry = NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (c->core) {
 | 
						if (c->core) {
 | 
				
			||||||
 | 
							spa_hook_remove(&c->core_listener),
 | 
				
			||||||
		pw_core_disconnect(c->core);
 | 
							pw_core_disconnect(c->core);
 | 
				
			||||||
		c->core = NULL;
 | 
							c->core = NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1518,6 +1518,7 @@ static void proxy_link_destroy(void *data)
 | 
				
			||||||
	struct link *l = data;
 | 
						struct link *l = data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spa_list_remove(&l->link);
 | 
						spa_list_remove(&l->link);
 | 
				
			||||||
 | 
						spa_hook_remove(&l->listener);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (l->endpoint_link) {
 | 
						if (l->endpoint_link) {
 | 
				
			||||||
		check_endpoint_link(l->endpoint_link);
 | 
							check_endpoint_link(l->endpoint_link);
 | 
				
			||||||
| 
						 | 
					@ -2032,12 +2033,19 @@ static void session_shutdown(struct impl *impl)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sm_media_session_emit_destroy(impl);
 | 
						sm_media_session_emit_destroy(impl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (impl->registry)
 | 
						if (impl->registry) {
 | 
				
			||||||
 | 
							spa_hook_remove(&impl->registry_listener);
 | 
				
			||||||
		pw_proxy_destroy((struct pw_proxy*)impl->registry);
 | 
							pw_proxy_destroy((struct pw_proxy*)impl->registry);
 | 
				
			||||||
	if (impl->policy_core)
 | 
						}
 | 
				
			||||||
 | 
						if (impl->policy_core) {
 | 
				
			||||||
 | 
							spa_hook_remove(&impl->policy_listener);
 | 
				
			||||||
 | 
							spa_hook_remove(&impl->proxy_policy_listener);
 | 
				
			||||||
		pw_core_disconnect(impl->policy_core);
 | 
							pw_core_disconnect(impl->policy_core);
 | 
				
			||||||
	if (impl->monitor_core)
 | 
						}
 | 
				
			||||||
 | 
						if (impl->monitor_core) {
 | 
				
			||||||
 | 
							spa_hook_remove(&impl->monitor_listener);
 | 
				
			||||||
		pw_core_disconnect(impl->monitor_core);
 | 
							pw_core_disconnect(impl->monitor_core);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	if (impl->this.info)
 | 
						if (impl->this.info)
 | 
				
			||||||
		pw_core_info_free(impl->this.info);
 | 
							pw_core_info_free(impl->this.info);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -91,6 +91,7 @@ static void node_destroy(void *data)
 | 
				
			||||||
	struct node_data *nd = data;
 | 
						struct node_data *nd = data;
 | 
				
			||||||
	pw_log_debug(NAME" %p: destroy %p", nd, nd->adapter);
 | 
						pw_log_debug(NAME" %p: destroy %p", nd, nd->adapter);
 | 
				
			||||||
	spa_list_remove(&nd->link);
 | 
						spa_list_remove(&nd->link);
 | 
				
			||||||
 | 
						spa_hook_remove(&nd->adapter_listener);
 | 
				
			||||||
	nd->adapter = NULL;
 | 
						nd->adapter = NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -77,6 +77,7 @@ struct node {
 | 
				
			||||||
static void node_free(void *data)
 | 
					static void node_free(void *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct node *n = data;
 | 
						struct node *n = data;
 | 
				
			||||||
 | 
						spa_hook_remove(&n->node_listener);
 | 
				
			||||||
	pw_properties_free(n->props);
 | 
						pw_properties_free(n->props);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,6 +44,8 @@ static void proxy_device_destroy(void *_data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct device_data *data = _data;
 | 
						struct device_data *data = _data;
 | 
				
			||||||
	spa_hook_remove(&data->device_listener);
 | 
						spa_hook_remove(&data->device_listener);
 | 
				
			||||||
 | 
						spa_hook_remove(&data->device_methods);
 | 
				
			||||||
 | 
						spa_hook_remove(&data->proxy_listener);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct pw_proxy_events proxy_events = {
 | 
					static const struct pw_proxy_events proxy_events = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -104,6 +104,7 @@ static void link_destroy(void *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct link_data *ld = data;
 | 
						struct link_data *ld = data;
 | 
				
			||||||
	spa_list_remove(&ld->l);
 | 
						spa_list_remove(&ld->l);
 | 
				
			||||||
 | 
						spa_hook_remove(&ld->link_listener);
 | 
				
			||||||
	if (ld->global)
 | 
						if (ld->global)
 | 
				
			||||||
		spa_hook_remove(&ld->global_listener);
 | 
							spa_hook_remove(&ld->global_listener);
 | 
				
			||||||
	if (ld->resource)
 | 
						if (ld->resource)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -123,6 +123,8 @@ static void global_unbind(void *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct resource_data *d = data;
 | 
						struct resource_data *d = data;
 | 
				
			||||||
	if (d->resource) {
 | 
						if (d->resource) {
 | 
				
			||||||
 | 
						        spa_hook_remove(&d->resource_listener);
 | 
				
			||||||
 | 
						        spa_hook_remove(&d->object_listener);
 | 
				
			||||||
	        spa_hook_remove(&d->metadata_listener);
 | 
						        spa_hook_remove(&d->metadata_listener);
 | 
				
			||||||
	        spa_hook_remove(&d->impl_resource_listener);
 | 
						        spa_hook_remove(&d->impl_resource_listener);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,7 +43,9 @@ struct object_data {
 | 
				
			||||||
static void proxy_object_destroy(void *_data)
 | 
					static void proxy_object_destroy(void *_data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct object_data *data = _data;
 | 
						struct object_data *data = _data;
 | 
				
			||||||
 | 
						spa_hook_remove(&data->proxy_listener);
 | 
				
			||||||
	spa_hook_remove(&data->object_listener);
 | 
						spa_hook_remove(&data->object_listener);
 | 
				
			||||||
 | 
						spa_hook_remove(&data->object_methods);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct pw_proxy_events proxy_events = {
 | 
					static const struct pw_proxy_events proxy_events = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -315,6 +315,8 @@ static void client_free(void *data)
 | 
				
			||||||
	pw_log_debug(NAME" %p: free", this);
 | 
						pw_log_debug(NAME" %p: free", this);
 | 
				
			||||||
	spa_list_remove(&this->protocol_link);
 | 
						spa_list_remove(&this->protocol_link);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						spa_hook_remove(&this->client_listener);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (this->source)
 | 
						if (this->source)
 | 
				
			||||||
		pw_loop_destroy_source(client->context->main_loop, this->source);
 | 
							pw_loop_destroy_source(client->context->main_loop, this->source);
 | 
				
			||||||
	if (this->connection)
 | 
						if (this->connection)
 | 
				
			||||||
| 
						 | 
					@ -329,6 +331,12 @@ static const struct pw_impl_client_events client_events = {
 | 
				
			||||||
	.busy_changed = client_busy_changed,
 | 
						.busy_changed = client_busy_changed,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void on_server_connection_destroy(void *data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct client_data *this = data;
 | 
				
			||||||
 | 
						spa_hook_remove(&this->conn_listener);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void on_start(void *data, uint32_t version)
 | 
					static void on_start(void *data, uint32_t version)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct client_data *this = data;
 | 
						struct client_data *this = data;
 | 
				
			||||||
| 
						 | 
					@ -351,6 +359,7 @@ static void on_start(void *data, uint32_t version)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct pw_protocol_native_connection_events server_conn_events = {
 | 
					static const struct pw_protocol_native_connection_events server_conn_events = {
 | 
				
			||||||
	PW_VERSION_PROTOCOL_NATIVE_CONNECTION_EVENTS,
 | 
						PW_VERSION_PROTOCOL_NATIVE_CONNECTION_EVENTS,
 | 
				
			||||||
 | 
						.destroy = on_server_connection_destroy,
 | 
				
			||||||
	.start = on_start,
 | 
						.start = on_start,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -772,6 +781,12 @@ error:
 | 
				
			||||||
	goto done;
 | 
						goto done;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void on_client_connection_destroy(void *data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct client *impl = data;
 | 
				
			||||||
 | 
						spa_hook_remove(&impl->conn_listener);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void on_need_flush(void *data)
 | 
					static void on_need_flush(void *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
        struct client *impl = data;
 | 
					        struct client *impl = data;
 | 
				
			||||||
| 
						 | 
					@ -787,6 +802,7 @@ static void on_need_flush(void *data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct pw_protocol_native_connection_events client_conn_events = {
 | 
					static const struct pw_protocol_native_connection_events client_conn_events = {
 | 
				
			||||||
	PW_VERSION_PROTOCOL_NATIVE_CONNECTION_EVENTS,
 | 
						PW_VERSION_PROTOCOL_NATIVE_CONNECTION_EVENTS,
 | 
				
			||||||
 | 
						.destroy = on_client_connection_destroy,
 | 
				
			||||||
	.need_flush = on_need_flush,
 | 
						.need_flush = on_need_flush,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -127,8 +127,12 @@ static void object_destroy(struct object *o)
 | 
				
			||||||
	struct manager *m = o->manager;
 | 
						struct manager *m = o->manager;
 | 
				
			||||||
	spa_list_remove(&o->this.link);
 | 
						spa_list_remove(&o->this.link);
 | 
				
			||||||
	m->this.n_objects--;
 | 
						m->this.n_objects--;
 | 
				
			||||||
	if (o->this.proxy)
 | 
						if (o->this.proxy) {
 | 
				
			||||||
 | 
							if (o->info->events)
 | 
				
			||||||
 | 
								spa_hook_remove(&o->object_listener);
 | 
				
			||||||
 | 
							spa_hook_remove(&o->proxy_listener);
 | 
				
			||||||
		pw_proxy_destroy(o->this.proxy);
 | 
							pw_proxy_destroy(o->this.proxy);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	free(o->this.type);
 | 
						free(o->this.type);
 | 
				
			||||||
	if (o->this.props)
 | 
						if (o->this.props)
 | 
				
			||||||
		pw_properties_free(o->this.props);
 | 
							pw_properties_free(o->this.props);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -188,6 +188,7 @@ static void factory_destroy(void *_data)
 | 
				
			||||||
	struct factory_data *data = _data;
 | 
						struct factory_data *data = _data;
 | 
				
			||||||
	struct device_data *nd;
 | 
						struct device_data *nd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						spa_hook_remove(&data->factory_listener);
 | 
				
			||||||
	spa_hook_remove(&data->module_listener);
 | 
						spa_hook_remove(&data->module_listener);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spa_list_consume(nd, &data->device_list, link)
 | 
						spa_list_consume(nd, &data->device_list, link)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -66,11 +66,6 @@ struct impl {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct resource_data {
 | 
					 | 
				
			||||||
	struct spa_hook resource_listener;
 | 
					 | 
				
			||||||
	struct spa_hook object_listener;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct factory_entry {
 | 
					struct factory_entry {
 | 
				
			||||||
	regex_t regex;
 | 
						regex_t regex;
 | 
				
			||||||
	char *lib;
 | 
						char *lib;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -250,6 +250,9 @@ static void proxy_core_destroy(void *data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_log_debug(NAME" %p: free", core);
 | 
						pw_log_debug(NAME" %p: free", core);
 | 
				
			||||||
	pw_properties_free(core->properties);
 | 
						pw_properties_free(core->properties);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						spa_hook_remove(&core->core_listener);
 | 
				
			||||||
 | 
						spa_hook_remove(&core->proxy_core_listener);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct pw_proxy_events proxy_core_events = {
 | 
					static const struct pw_proxy_events proxy_core_events = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,6 +44,7 @@ struct impl {
 | 
				
			||||||
#define pw_client_resource_permissions(r,...)	pw_client_resource(r,permissions,0,__VA_ARGS__)
 | 
					#define pw_client_resource_permissions(r,...)	pw_client_resource(r,permissions,0,__VA_ARGS__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct resource_data {
 | 
					struct resource_data {
 | 
				
			||||||
 | 
						struct pw_resource *resource;
 | 
				
			||||||
	struct spa_hook resource_listener;
 | 
						struct spa_hook resource_listener;
 | 
				
			||||||
	struct spa_hook object_listener;
 | 
						struct spa_hook object_listener;
 | 
				
			||||||
	struct pw_impl_client *client;
 | 
						struct pw_impl_client *client;
 | 
				
			||||||
| 
						 | 
					@ -123,8 +124,7 @@ static int error_resource(void *object, void *data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int client_error(void *object, uint32_t id, int res, const char *error)
 | 
					static int client_error(void *object, uint32_t id, int res, const char *error)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct pw_resource *resource = object;
 | 
						struct resource_data *data = object;
 | 
				
			||||||
	struct resource_data *data = pw_resource_get_user_data(resource);
 | 
					 | 
				
			||||||
	struct pw_impl_client *client = data->client;
 | 
						struct pw_impl_client *client = data->client;
 | 
				
			||||||
	struct error_data d = { id, res, error };
 | 
						struct error_data d = { id, res, error };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -208,8 +208,7 @@ static int finish_register(struct pw_impl_client *client)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int client_update_properties(void *object, const struct spa_dict *props)
 | 
					static int client_update_properties(void *object, const struct spa_dict *props)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct pw_resource *resource = object;
 | 
						struct resource_data *data = object;
 | 
				
			||||||
	struct resource_data *data = pw_resource_get_user_data(resource);
 | 
					 | 
				
			||||||
	struct pw_impl_client *client = data->client;
 | 
						struct pw_impl_client *client = data->client;
 | 
				
			||||||
	int res = update_properties(client, props, true);
 | 
						int res = update_properties(client, props, true);
 | 
				
			||||||
	finish_register(client);
 | 
						finish_register(client);
 | 
				
			||||||
| 
						 | 
					@ -218,8 +217,8 @@ static int client_update_properties(void *object, const struct spa_dict *props)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int client_get_permissions(void *object, uint32_t index, uint32_t num)
 | 
					static int client_get_permissions(void *object, uint32_t index, uint32_t num)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct pw_resource *resource = object;
 | 
						struct resource_data *data = object;
 | 
				
			||||||
	struct resource_data *data = pw_resource_get_user_data(resource);
 | 
						struct pw_resource *resource = data->resource;
 | 
				
			||||||
	struct pw_impl_client *client = data->client;
 | 
						struct pw_impl_client *client = data->client;
 | 
				
			||||||
	struct impl *impl = SPA_CONTAINER_OF(client, struct impl, this);
 | 
						struct impl *impl = SPA_CONTAINER_OF(client, struct impl, this);
 | 
				
			||||||
	size_t len;
 | 
						size_t len;
 | 
				
			||||||
| 
						 | 
					@ -238,8 +237,7 @@ static int client_get_permissions(void *object, uint32_t index, uint32_t num)
 | 
				
			||||||
static int client_update_permissions(void *object,
 | 
					static int client_update_permissions(void *object,
 | 
				
			||||||
		uint32_t n_permissions, const struct pw_permission *permissions)
 | 
							uint32_t n_permissions, const struct pw_permission *permissions)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct pw_resource *resource = object;
 | 
						struct resource_data *data = object;
 | 
				
			||||||
	struct resource_data *data = pw_resource_get_user_data(resource);
 | 
					 | 
				
			||||||
	struct pw_impl_client *client = data->client;
 | 
						struct pw_impl_client *client = data->client;
 | 
				
			||||||
	return pw_impl_client_update_permissions(client, n_permissions, permissions);
 | 
						return pw_impl_client_update_permissions(client, n_permissions, permissions);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -254,7 +252,10 @@ static const struct pw_client_methods client_methods = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void client_unbind_func(void *data)
 | 
					static void client_unbind_func(void *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct pw_resource *resource = data;
 | 
						struct resource_data *d = data;
 | 
				
			||||||
 | 
						struct pw_resource *resource = d->resource;
 | 
				
			||||||
 | 
						spa_hook_remove(&d->resource_listener);
 | 
				
			||||||
 | 
						spa_hook_remove(&d->object_listener);
 | 
				
			||||||
	if (resource->id == 1)
 | 
						if (resource->id == 1)
 | 
				
			||||||
		resource->client->client_resource = NULL;
 | 
							resource->client->client_resource = NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -278,13 +279,14 @@ global_bind(void *_data, struct pw_impl_client *client, uint32_t permissions,
 | 
				
			||||||
		goto error_resource;
 | 
							goto error_resource;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	data = pw_resource_get_user_data(resource);
 | 
						data = pw_resource_get_user_data(resource);
 | 
				
			||||||
 | 
						data->resource = resource;
 | 
				
			||||||
	data->client = this;
 | 
						data->client = this;
 | 
				
			||||||
	pw_resource_add_listener(resource,
 | 
						pw_resource_add_listener(resource,
 | 
				
			||||||
			&data->resource_listener,
 | 
								&data->resource_listener,
 | 
				
			||||||
			&resource_events, resource);
 | 
								&resource_events, data);
 | 
				
			||||||
	pw_resource_add_object_listener(resource,
 | 
						pw_resource_add_object_listener(resource,
 | 
				
			||||||
			&data->object_listener,
 | 
								&data->object_listener,
 | 
				
			||||||
			&client_methods, resource);
 | 
								&client_methods, data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_log_debug(NAME" %p: bound to %d", this, resource->id);
 | 
						pw_log_debug(NAME" %p: bound to %d", this, resource->id);
 | 
				
			||||||
	pw_global_add_resource(global, resource);
 | 
						pw_global_add_resource(global, resource);
 | 
				
			||||||
| 
						 | 
					@ -576,6 +578,8 @@ void pw_impl_client_destroy(struct pw_impl_client *client)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_map_clear(&client->objects);
 | 
						pw_map_clear(&client->objects);
 | 
				
			||||||
	pw_array_clear(&impl->permissions);
 | 
						pw_array_clear(&impl->permissions);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						spa_hook_remove(&impl->pool_listener);
 | 
				
			||||||
	pw_mempool_destroy(client->pool);
 | 
						pw_mempool_destroy(client->pool);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_properties_free(client->properties);
 | 
						pw_properties_free(client->properties);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,6 +35,7 @@
 | 
				
			||||||
#define NAME "impl-core"
 | 
					#define NAME "impl-core"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct resource_data {
 | 
					struct resource_data {
 | 
				
			||||||
 | 
						struct pw_resource *resource;
 | 
				
			||||||
	struct spa_hook resource_listener;
 | 
						struct spa_hook resource_listener;
 | 
				
			||||||
	struct spa_hook object_listener;
 | 
						struct spa_hook object_listener;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -129,8 +130,11 @@ static const struct pw_registry_methods registry_methods = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void destroy_registry_resource(void *object)
 | 
					static void destroy_registry_resource(void *object)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct pw_resource *resource = object;
 | 
						struct resource_data *data = object;
 | 
				
			||||||
 | 
						struct pw_resource *resource = data->resource;
 | 
				
			||||||
	spa_list_remove(&resource->link);
 | 
						spa_list_remove(&resource->link);
 | 
				
			||||||
 | 
						spa_hook_remove(&data->resource_listener);
 | 
				
			||||||
 | 
						spa_hook_remove(&data->object_listener);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct pw_resource_events resource_events = {
 | 
					static const struct pw_resource_events resource_events = {
 | 
				
			||||||
| 
						 | 
					@ -213,7 +217,7 @@ static int core_error(void *object, uint32_t id, int seq, int res, const char *m
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct pw_registry * core_get_registry(void *object, uint32_t version, size_t user_data_size)
 | 
					static struct pw_registry *core_get_registry(void *object, uint32_t version, size_t user_data_size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct pw_resource *resource = object;
 | 
						struct pw_resource *resource = object;
 | 
				
			||||||
	struct pw_impl_client *client = resource->client;
 | 
						struct pw_impl_client *client = resource->client;
 | 
				
			||||||
| 
						 | 
					@ -236,14 +240,15 @@ static struct pw_registry * core_get_registry(void *object, uint32_t version, si
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	data = pw_resource_get_user_data(registry_resource);
 | 
						data = pw_resource_get_user_data(registry_resource);
 | 
				
			||||||
 | 
						data->resource = registry_resource;
 | 
				
			||||||
	pw_resource_add_listener(registry_resource,
 | 
						pw_resource_add_listener(registry_resource,
 | 
				
			||||||
				&data->resource_listener,
 | 
									&data->resource_listener,
 | 
				
			||||||
				&resource_events,
 | 
									&resource_events,
 | 
				
			||||||
				registry_resource);
 | 
									data);
 | 
				
			||||||
	pw_resource_add_object_listener(registry_resource,
 | 
						pw_resource_add_object_listener(registry_resource,
 | 
				
			||||||
				&data->object_listener,
 | 
									&data->object_listener,
 | 
				
			||||||
				®istry_methods,
 | 
									®istry_methods,
 | 
				
			||||||
				registry_resource);
 | 
									resource);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spa_list_append(&context->registry_resource_list, ®istry_resource->link);
 | 
						spa_list_append(&context->registry_resource_list, ®istry_resource->link);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -446,7 +451,10 @@ void pw_impl_core_destroy(struct pw_impl_core *core)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void core_unbind_func(void *data)
 | 
					static void core_unbind_func(void *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct pw_resource *resource = data;
 | 
						struct resource_data *d = data;
 | 
				
			||||||
 | 
						struct pw_resource *resource = d->resource;
 | 
				
			||||||
 | 
						spa_hook_remove(&d->resource_listener);
 | 
				
			||||||
 | 
						spa_hook_remove(&d->object_listener);
 | 
				
			||||||
	if (resource->id == 0)
 | 
						if (resource->id == 0)
 | 
				
			||||||
		resource->client->core_resource = NULL;
 | 
							resource->client->core_resource = NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -476,11 +484,11 @@ global_bind(void *_data,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	data = pw_resource_get_user_data(resource);
 | 
						data = pw_resource_get_user_data(resource);
 | 
				
			||||||
 | 
						data->resource = resource;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_resource_add_listener(resource,
 | 
						pw_resource_add_listener(resource,
 | 
				
			||||||
			&data->resource_listener,
 | 
								&data->resource_listener,
 | 
				
			||||||
			&core_resource_events,
 | 
								&core_resource_events, data);
 | 
				
			||||||
			resource);
 | 
					 | 
				
			||||||
	pw_resource_add_object_listener(resource,
 | 
						pw_resource_add_object_listener(resource,
 | 
				
			||||||
			&data->object_listener,
 | 
								&data->object_listener,
 | 
				
			||||||
			&core_methods, resource);
 | 
								&core_methods, resource);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -190,6 +190,9 @@ void pw_impl_device_destroy(struct pw_impl_device *device)
 | 
				
			||||||
	if (device->registered)
 | 
						if (device->registered)
 | 
				
			||||||
		spa_list_remove(&device->link);
 | 
							spa_list_remove(&device->link);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (device->device) {
 | 
				
			||||||
 | 
							spa_hook_remove(&device->listener);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	if (device->global) {
 | 
						if (device->global) {
 | 
				
			||||||
		spa_hook_remove(&device->global_listener);
 | 
							spa_hook_remove(&device->global_listener);
 | 
				
			||||||
		pw_global_destroy(device->global);
 | 
							pw_global_destroy(device->global);
 | 
				
			||||||
| 
						 | 
					@ -216,6 +219,8 @@ static void resource_destroy(void *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct resource_data *d = data;
 | 
						struct resource_data *d = data;
 | 
				
			||||||
	remove_busy_resource(d);
 | 
						remove_busy_resource(d);
 | 
				
			||||||
 | 
						spa_hook_remove(&d->resource_listener);
 | 
				
			||||||
 | 
						spa_hook_remove(&d->object_listener);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void resource_pong(void *data, int seq)
 | 
					static void resource_pong(void *data, int seq)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -509,6 +509,8 @@ static void resource_destroy(void *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct resource_data *d = data;
 | 
						struct resource_data *d = data;
 | 
				
			||||||
	remove_busy_resource(d);
 | 
						remove_busy_resource(d);
 | 
				
			||||||
 | 
						spa_hook_remove(&d->resource_listener);
 | 
				
			||||||
 | 
						spa_hook_remove(&d->object_listener);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void resource_pong(void *data, int seq)
 | 
					static void resource_pong(void *data, int seq)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,6 +51,7 @@ struct resource_data {
 | 
				
			||||||
	struct pw_impl_port *port;
 | 
						struct pw_impl_port *port;
 | 
				
			||||||
	struct pw_resource *resource;
 | 
						struct pw_resource *resource;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct spa_hook resource_listener;
 | 
				
			||||||
	struct spa_hook object_listener;
 | 
						struct spa_hook object_listener;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uint32_t subscribe_ids[MAX_PARAMS];
 | 
						uint32_t subscribe_ids[MAX_PARAMS];
 | 
				
			||||||
| 
						 | 
					@ -731,6 +732,18 @@ static const struct pw_port_methods port_methods = {
 | 
				
			||||||
	.enum_params = port_enum_params
 | 
						.enum_params = port_enum_params
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void resource_destroy(void *data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct resource_data *d = data;
 | 
				
			||||||
 | 
						spa_hook_remove(&d->resource_listener);
 | 
				
			||||||
 | 
						spa_hook_remove(&d->object_listener);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct pw_resource_events resource_events = {
 | 
				
			||||||
 | 
						PW_VERSION_RESOURCE_EVENTS,
 | 
				
			||||||
 | 
						.destroy = resource_destroy,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
global_bind(void *_data, struct pw_impl_client *client, uint32_t permissions,
 | 
					global_bind(void *_data, struct pw_impl_client *client, uint32_t permissions,
 | 
				
			||||||
	       uint32_t version, uint32_t id)
 | 
						       uint32_t version, uint32_t id)
 | 
				
			||||||
| 
						 | 
					@ -751,6 +764,9 @@ global_bind(void *_data, struct pw_impl_client *client, uint32_t permissions,
 | 
				
			||||||
	data->port = this;
 | 
						data->port = this;
 | 
				
			||||||
	data->resource = resource;
 | 
						data->resource = resource;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pw_resource_add_listener(resource,
 | 
				
			||||||
 | 
								&data->resource_listener,
 | 
				
			||||||
 | 
								&resource_events, data);
 | 
				
			||||||
	pw_resource_add_object_listener(resource,
 | 
						pw_resource_add_object_listener(resource,
 | 
				
			||||||
			&data->object_listener,
 | 
								&data->object_listener,
 | 
				
			||||||
			&port_methods, data);
 | 
								&port_methods, data);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -432,6 +432,10 @@ static void on_core_destroy(void *_data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spa_list_remove(&rd->link);
 | 
						spa_list_remove(&rd->link);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						spa_hook_remove(&rd->core_listener);
 | 
				
			||||||
 | 
						spa_hook_remove(&rd->registry_listener);
 | 
				
			||||||
 | 
						spa_hook_remove(&rd->proxy_core_listener);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_map_remove(&data->vars, rd->id);
 | 
						pw_map_remove(&data->vars, rd->id);
 | 
				
			||||||
	pw_map_for_each(&rd->globals, destroy_global, rd);
 | 
						pw_map_for_each(&rd->globals, destroy_global, rd);
 | 
				
			||||||
	pw_map_clear(&rd->globals);
 | 
						pw_map_clear(&rd->globals);
 | 
				
			||||||
| 
						 | 
					@ -1111,6 +1115,9 @@ destroy_proxy (void *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct proxy_data *pd = data;
 | 
						struct proxy_data *pd = data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						spa_hook_remove(&pd->proxy_listener);
 | 
				
			||||||
 | 
						spa_hook_remove(&pd->object_listener);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (pd->info == NULL)
 | 
						if (pd->info == NULL)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue