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
|
void
|
||||||
wl_closure_print(struct wl_closure *closure, struct wl_object *target,
|
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;
|
int i;
|
||||||
struct argument_details arg;
|
struct argument_details arg;
|
||||||
const char *signature = closure->message->signature;
|
const char *signature = closure->message->signature;
|
||||||
struct timespec tp;
|
struct timespec tp;
|
||||||
unsigned int time;
|
unsigned int time;
|
||||||
|
uint32_t nval;
|
||||||
|
|
||||||
clock_gettime(CLOCK_REALTIME, &tp);
|
clock_gettime(CLOCK_REALTIME, &tp);
|
||||||
time = (tp.tv_sec * 1000000L) + (tp.tv_nsec / 1000);
|
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");
|
fprintf(stderr, "nil");
|
||||||
break;
|
break;
|
||||||
case 'n':
|
case 'n':
|
||||||
|
if (n_parse)
|
||||||
|
nval = n_parse(&closure->args[i]);
|
||||||
|
else
|
||||||
|
nval = closure->args[i].n;
|
||||||
|
|
||||||
fprintf(stderr, "new id %s@",
|
fprintf(stderr, "new id %s@",
|
||||||
(closure->message->types[i]) ?
|
(closure->message->types[i]) ?
|
||||||
closure->message->types[i]->name :
|
closure->message->types[i]->name :
|
||||||
"[unknown]");
|
"[unknown]");
|
||||||
if (closure->args[i].n != 0)
|
if (nval != 0)
|
||||||
fprintf(stderr, "%u", closure->args[i].n);
|
fprintf(stderr, "%u", nval);
|
||||||
else
|
else
|
||||||
fprintf(stderr, "nil");
|
fprintf(stderr, "nil");
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -847,7 +847,7 @@ wl_proxy_marshal_array_flags(struct wl_proxy *proxy, uint32_t opcode,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (debug_client)
|
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)) {
|
if (wl_closure_send(closure, proxy->display->connection)) {
|
||||||
wl_log("Error sending request: %s\n", strerror(errno));
|
wl_log("Error sending request: %s\n", strerror(errno));
|
||||||
|
|
@ -1531,6 +1531,19 @@ queue_event(struct wl_display *display, int len)
|
||||||
return size;
|
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
|
static void
|
||||||
dispatch_event(struct wl_display *display, struct wl_event_queue *queue)
|
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);
|
proxy_destroyed = !!(proxy->flags & WL_PROXY_FLAG_DESTROYED);
|
||||||
if (proxy_destroyed) {
|
if (proxy_destroyed) {
|
||||||
if (debug_client)
|
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);
|
destroy_queued_closure(closure);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -1559,13 +1572,13 @@ dispatch_event(struct wl_display *display, struct wl_event_queue *queue)
|
||||||
|
|
||||||
if (proxy->dispatcher) {
|
if (proxy->dispatcher) {
|
||||||
if (debug_client)
|
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,
|
wl_closure_dispatch(closure, proxy->dispatcher,
|
||||||
&proxy->object, opcode);
|
&proxy->object, opcode);
|
||||||
} else if (proxy->object.implementation) {
|
} else if (proxy->object.implementation) {
|
||||||
if (debug_client)
|
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,
|
wl_closure_invoke(closure, WL_CLOSURE_INVOKE_CLIENT,
|
||||||
&proxy->object, opcode, proxy->user_data);
|
&proxy->object, opcode, proxy->user_data);
|
||||||
|
|
|
||||||
|
|
@ -211,7 +211,8 @@ wl_closure_queue(struct wl_closure *closure, struct wl_connection *connection);
|
||||||
|
|
||||||
void
|
void
|
||||||
wl_closure_print(struct wl_closure *closure,
|
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
|
void
|
||||||
wl_closure_destroy(struct wl_closure *closure);
|
wl_closure_destroy(struct wl_closure *closure);
|
||||||
|
|
|
||||||
|
|
@ -156,7 +156,7 @@ log_closure(struct wl_resource *resource,
|
||||||
struct wl_protocol_logger_message message;
|
struct wl_protocol_logger_message message;
|
||||||
|
|
||||||
if (debug_server)
|
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)) {
|
if (!wl_list_empty(&display->protocol_loggers)) {
|
||||||
message.resource = resource;
|
message.resource = resource;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue