mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	remote-node: only signal graph end when profiling
Add a flag to the activation to mark the node as being profiled. Only wake up the eventfd in remote-node when the profiler is running. This keeps the server sleeping when remote nodes are driving and the profiler is not running.
This commit is contained in:
		
							parent
							
								
									5fcc0e1181
								
							
						
					
					
						commit
						a5b845650e
					
				
					 3 changed files with 15 additions and 9 deletions
				
			
		| 
						 | 
					@ -1170,19 +1170,13 @@ static const struct pw_proxy_events proxy_client_node_events = {
 | 
				
			||||||
	.bound_props = client_node_bound_props,
 | 
						.bound_props = client_node_bound_props,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline uint64_t get_time_ns(struct spa_system *system)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct timespec ts;
 | 
					 | 
				
			||||||
	spa_system_clock_gettime(system, CLOCK_MONOTONIC, &ts);
 | 
					 | 
				
			||||||
	return SPA_TIMESPEC_TO_NSEC(&ts);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void context_complete(void *data, struct pw_impl_node *node)
 | 
					static void context_complete(void *data, struct pw_impl_node *node)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct node_data *d = data;
 | 
						struct node_data *d = data;
 | 
				
			||||||
	struct spa_system *data_system = d->data_system;
 | 
						struct spa_system *data_system = d->data_system;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (node != d->node || !node->driving)
 | 
						if (node != d->node || !node->driving ||
 | 
				
			||||||
 | 
						    !SPA_FLAG_IS_SET(node->rt.target.activation->flags, PW_NODE_ACTIVATION_FLAG_PROFILER))
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (SPA_UNLIKELY(spa_system_eventfd_write(data_system, d->rtwritefd, 1) < 0))
 | 
						if (SPA_UNLIKELY(spa_system_eventfd_write(data_system, d->rtwritefd, 1) < 0))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -505,6 +505,10 @@ void pw_context_driver_add_listener(struct pw_context *context,
 | 
				
			||||||
		.listener = listener,
 | 
							.listener = listener,
 | 
				
			||||||
		.events = events,
 | 
							.events = events,
 | 
				
			||||||
		.data = data };
 | 
							.data = data };
 | 
				
			||||||
 | 
						struct pw_impl_node *n;
 | 
				
			||||||
 | 
						spa_list_for_each(n, &context->driver_list, driver_link) {
 | 
				
			||||||
 | 
							SPA_FLAG_SET(n->rt.target.activation->flags, PW_NODE_ACTIVATION_FLAG_PROFILER);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	pw_loop_invoke(context->data_loop,
 | 
						pw_loop_invoke(context->data_loop,
 | 
				
			||||||
                       do_add_listener, SPA_ID_INVALID, &d, sizeof(d), false, context);
 | 
					                       do_add_listener, SPA_ID_INVALID, &d, sizeof(d), false, context);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -521,6 +525,10 @@ SPA_EXPORT
 | 
				
			||||||
void pw_context_driver_remove_listener(struct pw_context *context,
 | 
					void pw_context_driver_remove_listener(struct pw_context *context,
 | 
				
			||||||
			  struct spa_hook *listener)
 | 
								  struct spa_hook *listener)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						struct pw_impl_node *n;
 | 
				
			||||||
 | 
						spa_list_for_each(n, &context->driver_list, driver_link) {
 | 
				
			||||||
 | 
							SPA_FLAG_CLEAR(n->rt.target.activation->flags, PW_NODE_ACTIVATION_FLAG_PROFILER);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	pw_loop_invoke(context->data_loop,
 | 
						pw_loop_invoke(context->data_loop,
 | 
				
			||||||
                       do_remove_listener, SPA_ID_INVALID, NULL, 0, true, listener);
 | 
					                       do_remove_listener, SPA_ID_INVALID, NULL, 0, true, listener);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -635,9 +635,13 @@ struct pw_node_activation {
 | 
				
			||||||
							 * used when driver segment_owner has this node id */
 | 
												 * used when driver segment_owner has this node id */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* for drivers, shared with all nodes */
 | 
						/* for drivers, shared with all nodes */
 | 
				
			||||||
	uint32_t segment_owner[32];			/* id of owners for each segment info struct.
 | 
						uint32_t segment_owner[16];			/* id of owners for each segment info struct.
 | 
				
			||||||
							 * nodes that want to update segment info need to
 | 
												 * nodes that want to update segment info need to
 | 
				
			||||||
							 * CAS their node id in this array. */
 | 
												 * CAS their node id in this array. */
 | 
				
			||||||
 | 
						uint32_t padding[15];
 | 
				
			||||||
 | 
					#define PW_NODE_ACTIVATION_FLAG_NONE		0
 | 
				
			||||||
 | 
					#define PW_NODE_ACTIVATION_FLAG_PROFILER	(1<<0)	/* the profiler is running */
 | 
				
			||||||
 | 
						uint32_t flags;					/* extra flags */
 | 
				
			||||||
	struct spa_io_position position;		/* contains current position and segment info.
 | 
						struct spa_io_position position;		/* contains current position and segment info.
 | 
				
			||||||
							 * extra info is updated by nodes that have set
 | 
												 * extra info is updated by nodes that have set
 | 
				
			||||||
							 * themselves as owner in the segment structs */
 | 
												 * themselves as owner in the segment structs */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue