mirror of
				https://gitlab.freedesktop.org/wayland/wayland.git
				synced 2025-11-03 09:01:42 -05:00 
			
		
		
		
	debug: Fix printing of new ids
The client side closure traces have incorrect object ids for new server generated objects. This is because create_proxies() overwrites the id in 'n' type arguments by storing a pointer to the actual object in the 'o' field of the union. Getting back to an id from this pointer requires accessing a structure that isn't visible outside of wayland-client.c. Add a function pointer to fish the correct value out of the argument and pass it to wl_closure_print. Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
This commit is contained in:
		
							parent
							
								
									9c05e6c475
								
							
						
					
					
						commit
						ca893075ef
					
				
					 4 changed files with 29 additions and 9 deletions
				
			
		| 
						 | 
				
			
			@ -1264,13 +1264,14 @@ wl_closure_queue(struct wl_closure *closure, struct wl_connection *connection)
 | 
			
		|||
 | 
			
		||||
void
 | 
			
		||||
wl_closure_print(struct wl_closure *closure, struct wl_object *target,
 | 
			
		||||
		 int send, int discarded)
 | 
			
		||||
		 int send, int discarded, uint32_t (*n_parse)(union wl_argument *arg))
 | 
			
		||||
{
 | 
			
		||||
	int i;
 | 
			
		||||
	struct argument_details arg;
 | 
			
		||||
	const char *signature = closure->message->signature;
 | 
			
		||||
	struct timespec tp;
 | 
			
		||||
	unsigned int time;
 | 
			
		||||
	uint32_t nval;
 | 
			
		||||
 | 
			
		||||
	clock_gettime(CLOCK_REALTIME, &tp);
 | 
			
		||||
	time = (tp.tv_sec * 1000000L) + (tp.tv_nsec / 1000);
 | 
			
		||||
| 
						 | 
				
			
			@ -1322,12 +1323,17 @@ wl_closure_print(struct wl_closure *closure, struct wl_object *target,
 | 
			
		|||
				fprintf(stderr, "nil");
 | 
			
		||||
			break;
 | 
			
		||||
		case 'n':
 | 
			
		||||
			if (n_parse)
 | 
			
		||||
				nval = n_parse(&closure->args[i]);
 | 
			
		||||
			else
 | 
			
		||||
				nval = closure->args[i].n;
 | 
			
		||||
 | 
			
		||||
			fprintf(stderr, "new id %s@",
 | 
			
		||||
				(closure->message->types[i]) ?
 | 
			
		||||
				 closure->message->types[i]->name :
 | 
			
		||||
				  "[unknown]");
 | 
			
		||||
			if (closure->args[i].n != 0)
 | 
			
		||||
				fprintf(stderr, "%u", closure->args[i].n);
 | 
			
		||||
			if (nval != 0)
 | 
			
		||||
				fprintf(stderr, "%u", nval);
 | 
			
		||||
			else
 | 
			
		||||
				fprintf(stderr, "nil");
 | 
			
		||||
			break;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -847,7 +847,7 @@ wl_proxy_marshal_array_flags(struct wl_proxy *proxy, uint32_t opcode,
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	if (debug_client)
 | 
			
		||||
		wl_closure_print(closure, &proxy->object, true, false);
 | 
			
		||||
		wl_closure_print(closure, &proxy->object, true, false, NULL);
 | 
			
		||||
 | 
			
		||||
	if (wl_closure_send(closure, proxy->display->connection)) {
 | 
			
		||||
		wl_log("Error sending request: %s\n", strerror(errno));
 | 
			
		||||
| 
						 | 
				
			
			@ -1531,6 +1531,19 @@ queue_event(struct wl_display *display, int len)
 | 
			
		|||
	return size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static uint32_t
 | 
			
		||||
id_from_object(union wl_argument *arg)
 | 
			
		||||
{
 | 
			
		||||
	struct wl_proxy *proxy;
 | 
			
		||||
 | 
			
		||||
	if (arg->o) {
 | 
			
		||||
		proxy = (struct wl_proxy *)arg->o;
 | 
			
		||||
		return proxy->object.id;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
dispatch_event(struct wl_display *display, struct wl_event_queue *queue)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -1550,7 +1563,7 @@ dispatch_event(struct wl_display *display, struct wl_event_queue *queue)
 | 
			
		|||
	proxy_destroyed = !!(proxy->flags & WL_PROXY_FLAG_DESTROYED);
 | 
			
		||||
	if (proxy_destroyed) {
 | 
			
		||||
		if (debug_client)
 | 
			
		||||
			wl_closure_print(closure, &proxy->object, false, true);
 | 
			
		||||
			wl_closure_print(closure, &proxy->object, false, true, id_from_object);
 | 
			
		||||
		destroy_queued_closure(closure);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -1559,13 +1572,13 @@ dispatch_event(struct wl_display *display, struct wl_event_queue *queue)
 | 
			
		|||
 | 
			
		||||
	if (proxy->dispatcher) {
 | 
			
		||||
		if (debug_client)
 | 
			
		||||
			wl_closure_print(closure, &proxy->object, false, false);
 | 
			
		||||
			wl_closure_print(closure, &proxy->object, false, false, id_from_object);
 | 
			
		||||
 | 
			
		||||
		wl_closure_dispatch(closure, proxy->dispatcher,
 | 
			
		||||
				    &proxy->object, opcode);
 | 
			
		||||
	} else if (proxy->object.implementation) {
 | 
			
		||||
		if (debug_client)
 | 
			
		||||
			wl_closure_print(closure, &proxy->object, false, false);
 | 
			
		||||
			wl_closure_print(closure, &proxy->object, false, false, id_from_object);
 | 
			
		||||
 | 
			
		||||
		wl_closure_invoke(closure, WL_CLOSURE_INVOKE_CLIENT,
 | 
			
		||||
				  &proxy->object, opcode, proxy->user_data);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -211,7 +211,8 @@ wl_closure_queue(struct wl_closure *closure, struct wl_connection *connection);
 | 
			
		|||
 | 
			
		||||
void
 | 
			
		||||
wl_closure_print(struct wl_closure *closure,
 | 
			
		||||
		 struct wl_object *target, int send, int discarded);
 | 
			
		||||
		 struct wl_object *target, int send, int discarded,
 | 
			
		||||
		 uint32_t (*n_parse)(union wl_argument *arg));
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
wl_closure_destroy(struct wl_closure *closure);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -156,7 +156,7 @@ log_closure(struct wl_resource *resource,
 | 
			
		|||
	struct wl_protocol_logger_message message;
 | 
			
		||||
 | 
			
		||||
	if (debug_server)
 | 
			
		||||
		wl_closure_print(closure, object, send, false);
 | 
			
		||||
		wl_closure_print(closure, object, send, false, NULL);
 | 
			
		||||
 | 
			
		||||
	if (!wl_list_empty(&display->protocol_loggers)) {
 | 
			
		||||
		message.resource = resource;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue