mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	impl-client: improve constructor
Pass the protocol in constructor Keep the link in the server protocol list private to the prototol.
This commit is contained in:
		
							parent
							
								
									d99b1918ed
								
							
						
					
					
						commit
						73eea24443
					
				
					 5 changed files with 29 additions and 22 deletions
				
			
		| 
						 | 
					@ -108,6 +108,8 @@ struct client_data {
 | 
				
			||||||
	struct pw_impl_client *client;
 | 
						struct pw_impl_client *client;
 | 
				
			||||||
	struct spa_hook client_listener;
 | 
						struct spa_hook client_listener;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct spa_list protocol_link;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct spa_source *source;
 | 
						struct spa_source *source;
 | 
				
			||||||
	struct pw_protocol_native_connection *connection;
 | 
						struct pw_protocol_native_connection *connection;
 | 
				
			||||||
	struct spa_hook conn_listener;
 | 
						struct spa_hook conn_listener;
 | 
				
			||||||
| 
						 | 
					@ -261,7 +263,7 @@ connection_data(void *data, int fd, uint32_t mask)
 | 
				
			||||||
		if (res >= 0) {
 | 
							if (res >= 0) {
 | 
				
			||||||
			int mask = this->source->mask;
 | 
								int mask = this->source->mask;
 | 
				
			||||||
			SPA_FLAG_CLEAR(mask, SPA_IO_OUT);
 | 
								SPA_FLAG_CLEAR(mask, SPA_IO_OUT);
 | 
				
			||||||
			pw_loop_update_io(client->protocol->context->main_loop,
 | 
								pw_loop_update_io(client->context->main_loop,
 | 
				
			||||||
					this->source, mask);
 | 
										this->source, mask);
 | 
				
			||||||
		} else if (res != EAGAIN) {
 | 
							} else if (res != EAGAIN) {
 | 
				
			||||||
			pw_log_error("client %p: could not flush: %s",
 | 
								pw_log_error("client %p: could not flush: %s",
 | 
				
			||||||
| 
						 | 
					@ -279,10 +281,10 @@ static void client_free(void *data)
 | 
				
			||||||
	struct client_data *this = data;
 | 
						struct client_data *this = data;
 | 
				
			||||||
	struct pw_impl_client *client = this->client;
 | 
						struct pw_impl_client *client = this->client;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spa_list_remove(&client->protocol_link);
 | 
						spa_list_remove(&this->protocol_link);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (this->source)
 | 
						if (this->source)
 | 
				
			||||||
		pw_loop_destroy_source(client->protocol->context->main_loop, this->source);
 | 
							pw_loop_destroy_source(client->context->main_loop, this->source);
 | 
				
			||||||
	if (this->connection)
 | 
						if (this->connection)
 | 
				
			||||||
		pw_protocol_native_connection_destroy(this->connection);
 | 
							pw_protocol_native_connection_destroy(this->connection);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -356,15 +358,13 @@ static struct client_data *client_new(struct server *s, int fd)
 | 
				
			||||||
	pw_properties_setf(props, PW_KEY_MODULE_ID, "%d", d->module->global->id);
 | 
						pw_properties_setf(props, PW_KEY_MODULE_ID, "%d", d->module->global->id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	client = pw_impl_client_new(protocol->context,
 | 
						client = pw_impl_client_new(protocol->context,
 | 
				
			||||||
			       props,
 | 
								protocol, props, sizeof(struct client_data));
 | 
				
			||||||
			       sizeof(struct client_data));
 | 
					 | 
				
			||||||
	if (client == NULL)
 | 
						if (client == NULL)
 | 
				
			||||||
		goto exit;
 | 
							goto exit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	this = pw_impl_client_get_user_data(client);
 | 
						this = pw_impl_client_get_user_data(client);
 | 
				
			||||||
	client->protocol = protocol;
 | 
						spa_list_append(&s->this.client_list, &this->protocol_link);
 | 
				
			||||||
	spa_list_append(&s->this.client_list, &client->protocol_link);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	this->client = client;
 | 
						this->client = client;
 | 
				
			||||||
	this->source = pw_loop_add_io(pw_context_get_main_loop(context),
 | 
						this->source = pw_loop_add_io(pw_context_get_main_loop(context),
 | 
				
			||||||
| 
						 | 
					@ -868,13 +868,13 @@ error_free:
 | 
				
			||||||
static void destroy_server(struct pw_protocol_server *server)
 | 
					static void destroy_server(struct pw_protocol_server *server)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct server *s = SPA_CONTAINER_OF(server, struct server, this);
 | 
						struct server *s = SPA_CONTAINER_OF(server, struct server, this);
 | 
				
			||||||
	struct pw_impl_client *client, *tmp;
 | 
						struct client_data *data, *tmp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spa_list_remove(&server->link);
 | 
						spa_list_remove(&server->link);
 | 
				
			||||||
	spa_hook_remove(&s->hook);
 | 
						spa_hook_remove(&s->hook);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spa_list_for_each_safe(client, tmp, &server->client_list, protocol_link)
 | 
						spa_list_for_each_safe(data, tmp, &server->client_list, protocol_link)
 | 
				
			||||||
		pw_impl_client_destroy(client);
 | 
							pw_impl_client_destroy(data->client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (s->source) {
 | 
						if (s->source) {
 | 
				
			||||||
		spa_hook_remove(&s->hook);
 | 
							spa_hook_remove(&s->hook);
 | 
				
			||||||
| 
						 | 
					@ -893,23 +893,20 @@ static void on_before_hook(void *_data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct server *server = _data;
 | 
						struct server *server = _data;
 | 
				
			||||||
	struct pw_protocol_server *this = &server->this;
 | 
						struct pw_protocol_server *this = &server->this;
 | 
				
			||||||
	struct pw_impl_client *client, *tmp;
 | 
						struct client_data *data, *tmp;
 | 
				
			||||||
	struct client_data *data;
 | 
					 | 
				
			||||||
	int res;
 | 
						int res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spa_list_for_each_safe(client, tmp, &this->client_list, protocol_link) {
 | 
						spa_list_for_each_safe(data, tmp, &this->client_list, protocol_link) {
 | 
				
			||||||
		data = client->user_data;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		res = pw_protocol_native_connection_flush(data->connection);
 | 
							res = pw_protocol_native_connection_flush(data->connection);
 | 
				
			||||||
		if (res == -EAGAIN) {
 | 
							if (res == -EAGAIN) {
 | 
				
			||||||
			int mask = data->source->mask;
 | 
								int mask = data->source->mask;
 | 
				
			||||||
			SPA_FLAG_SET(mask, SPA_IO_OUT);
 | 
								SPA_FLAG_SET(mask, SPA_IO_OUT);
 | 
				
			||||||
			pw_loop_update_io(client->protocol->context->main_loop,
 | 
								pw_loop_update_io(data->client->context->main_loop,
 | 
				
			||||||
					data->source, mask);
 | 
										data->source, mask);
 | 
				
			||||||
		} else if (res < 0) {
 | 
							} else if (res < 0) {
 | 
				
			||||||
			pw_log_warn("client %p: could not flush: %s",
 | 
								pw_log_warn("client %p: could not flush: %s",
 | 
				
			||||||
					data->client, spa_strerror(res));
 | 
										data->client, spa_strerror(res));
 | 
				
			||||||
			pw_impl_client_destroy(client);
 | 
								pw_impl_client_destroy(data->client);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -281,6 +281,7 @@ static const struct pw_context_events context_events = {
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
SPA_EXPORT
 | 
					SPA_EXPORT
 | 
				
			||||||
struct pw_impl_client *pw_impl_client_new(struct pw_context *context,
 | 
					struct pw_impl_client *pw_impl_client_new(struct pw_context *context,
 | 
				
			||||||
 | 
									struct pw_protocol *protocol,
 | 
				
			||||||
				struct pw_properties *properties,
 | 
									struct pw_properties *properties,
 | 
				
			||||||
				size_t user_data_size)
 | 
									size_t user_data_size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -299,6 +300,7 @@ struct pw_impl_client *pw_impl_client_new(struct pw_context *context,
 | 
				
			||||||
	pw_log_debug(NAME" %p: new", this);
 | 
						pw_log_debug(NAME" %p: new", this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	this->context = context;
 | 
						this->context = context;
 | 
				
			||||||
 | 
						this->protocol = protocol;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (properties == NULL)
 | 
						if (properties == NULL)
 | 
				
			||||||
		properties = pw_properties_new(NULL, NULL);
 | 
							properties = pw_properties_new(NULL, NULL);
 | 
				
			||||||
| 
						 | 
					@ -428,6 +430,12 @@ struct pw_context *pw_impl_client_get_context(struct pw_impl_client *client)
 | 
				
			||||||
	return client->context;
 | 
						return client->context;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SPA_EXPORT
 | 
				
			||||||
 | 
					struct pw_protocol *pw_impl_client_get_protocol(struct pw_impl_client *client)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return client->protocol;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SPA_EXPORT
 | 
					SPA_EXPORT
 | 
				
			||||||
struct pw_resource *pw_impl_client_get_core_resource(struct pw_impl_client *client)
 | 
					struct pw_resource *pw_impl_client_get_core_resource(struct pw_impl_client *client)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -110,9 +110,10 @@ struct pw_impl_client_events {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Create a new client. This is mainly used by protocols. */
 | 
					/** Create a new client. This is mainly used by protocols. */
 | 
				
			||||||
struct pw_impl_client *
 | 
					struct pw_impl_client *
 | 
				
			||||||
pw_impl_client_new(struct pw_context *context,		/**< the context object */
 | 
					pw_impl_client_new(struct pw_context *context,			/**< the context object */
 | 
				
			||||||
	      struct pw_properties *properties,	/**< client properties */
 | 
								struct pw_protocol *prototol,		/**< the client protocol */
 | 
				
			||||||
	      size_t user_data_size		/**< extra user data size */);
 | 
								struct pw_properties *properties,	/**< client properties */
 | 
				
			||||||
 | 
								size_t user_data_size			/**< extra user data size */);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Destroy a previously created client */
 | 
					/** Destroy a previously created client */
 | 
				
			||||||
void pw_impl_client_destroy(struct pw_impl_client *client);
 | 
					void pw_impl_client_destroy(struct pw_impl_client *client);
 | 
				
			||||||
| 
						 | 
					@ -139,6 +140,8 @@ const struct pw_properties *pw_impl_client_get_properties(struct pw_impl_client
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Get the context used to create this client */
 | 
					/** Get the context used to create this client */
 | 
				
			||||||
struct pw_context *pw_impl_client_get_context(struct pw_impl_client *client);
 | 
					struct pw_context *pw_impl_client_get_context(struct pw_impl_client *client);
 | 
				
			||||||
 | 
					/** Get the protocol used to create this client */
 | 
				
			||||||
 | 
					struct pw_protocol *pw_impl_client_get_protocol(struct pw_impl_client *client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Get the client context resource */
 | 
					/** Get the client context resource */
 | 
				
			||||||
struct pw_resource *pw_impl_client_get_core_resource(struct pw_impl_client *client);
 | 
					struct pw_resource *pw_impl_client_get_core_resource(struct pw_impl_client *client);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -99,7 +99,7 @@ struct pw_impl_node_events {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Create a new node \memberof pw_impl_node */
 | 
					/** Create a new node \memberof pw_impl_node */
 | 
				
			||||||
struct pw_impl_node *
 | 
					struct pw_impl_node *
 | 
				
			||||||
pw_impl_node_new(struct pw_context *context,		/**< the context */
 | 
					pw_impl_node_new(struct pw_context *context,	/**< the context */
 | 
				
			||||||
	    struct pw_properties *properties,	/**< extra properties */
 | 
						    struct pw_properties *properties,	/**< extra properties */
 | 
				
			||||||
	    size_t user_data_size		/**< user data size */);
 | 
						    size_t user_data_size		/**< user data size */);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -117,7 +117,6 @@ struct pw_impl_client {
 | 
				
			||||||
	struct spa_hook_list listener_list;
 | 
						struct spa_hook_list listener_list;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct pw_protocol *protocol;	/**< protocol in use */
 | 
						struct pw_protocol *protocol;	/**< protocol in use */
 | 
				
			||||||
	struct spa_list protocol_link;	/**< link in the protocol client_list */
 | 
					 | 
				
			||||||
	int recv_seq;			/**< last received sequence number */
 | 
						int recv_seq;			/**< last received sequence number */
 | 
				
			||||||
	int send_seq;			/**< last sender sequence number */
 | 
						int send_seq;			/**< last sender sequence number */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue