debug: Fix printing of new ids
authorDerek Foreman <derek.foreman@collabora.com>
Tue, 24 Aug 2021 22:08:51 +0000 (17:08 -0500)
committerDaniel Stone <daniels@collabora.com>
Tue, 2 Nov 2021 11:27:51 +0000 (11:27 +0000)
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>
src/connection.c
src/wayland-client.c
src/wayland-private.h
src/wayland-server.c

index ad16eee..98f503b 100644 (file)
@@ -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;
index 66f60e3..4fd7c90 100644 (file)
@@ -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);
index 493e1be..210451e 100644 (file)
@@ -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);
index 6ae4689..02f1365 100644 (file)
@@ -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;