server: set resource id of exported wl_buffer to debug_data 97/233097/3
authorChangyeon Lee <cyeon.lee@samsung.com>
Mon, 11 May 2020 11:37:42 +0000 (20:37 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Wed, 13 May 2020 07:04:17 +0000 (16:04 +0900)
print resource id of exported wl_buffer
at wayland-tbm-monitor -show server

Change-Id: I21610f68f29d6ed7cc7f951171859defa8bdfec7

src/wayland-tbm-server.c

index 3c1c59e..cfa1b58 100644 (file)
@@ -55,7 +55,7 @@ DEALINGS IN THE SOFTWARE.
 #define WL_TBM_TRACE(fmt, ...)
 #endif
 
-
+#define DEBUG_ID_LEN 1024
 #define MIN(x, y) (((x) < (y)) ? (x) : (y))
 
 struct wayland_tbm_buffer {
@@ -75,6 +75,7 @@ struct wayland_tbm_buffer {
        tbm_fd sync_timeline;
        int transform;
        uint32_t serial;
+       int exported;
 };
 
 struct wayland_tbm_client_resource {
@@ -165,6 +166,59 @@ out:
        return NULL;
 }
 
+void
+_wayland_tbm_server_update_export_debug_id(tbm_surface_h surface)
+{
+       struct wayland_tbm_user_data *ud = NULL;
+       struct wayland_tbm_buffer *pos;
+       char debug_id[DEBUG_ID_LEN] = {0, };
+       int len = DEBUG_ID_LEN;
+       pid_t pid;
+
+       ud = _wayland_tbm_server_get_user_data(surface);
+       if (!ud) return;
+
+       wl_list_for_each_reverse(pos, &ud->wayland_tbm_buffer_list, link_ref) {
+               char id[64] = {0, };
+               int id_len = 0;
+
+               if (!pos->wl_buffer) continue;
+               if (!pos->exported) continue;
+
+               wl_client_get_credentials(pos->client, &pid, NULL, NULL);
+               id_len = snprintf(id, sizeof(id), "%u(%u)", (unsigned int)wl_resource_get_id(pos->wl_buffer), pid);
+
+               len -= (id_len + 2);
+               if ((id_len > 0) && (len > 0)) {
+                       strncat(debug_id, id, len - 2);
+                       strncat(debug_id, " ", 2);
+               } else {
+                       break;
+               }
+       }
+
+       if (debug_id[0] != '\0')
+               tbm_surface_internal_set_debug_data(surface, "export_id", debug_id);
+       else
+               tbm_surface_internal_set_debug_data(surface, "export_id", NULL);
+}
+
+void
+_wayland_tbm_server_set_debug_info(struct wayland_tbm_buffer *tbm_buffer)
+{
+       char debug_id[64] = {0, };
+       pid_t pid;
+
+       if (!tbm_buffer) return;
+       if (!tbm_buffer->surface) return;
+       if (!tbm_buffer->client) return;
+
+       wl_client_get_credentials(tbm_buffer->client, &pid, NULL, NULL);
+       tbm_surface_internal_set_debug_pid(tbm_buffer->surface, pid);
+       snprintf(debug_id, sizeof(debug_id), "%-4u", (unsigned int)wl_resource_get_id(tbm_buffer->wl_buffer));
+       tbm_surface_internal_set_debug_data(tbm_buffer->surface, "id  ", debug_id);
+}
+
 static void
 _wayland_tbm_server_tbm_buffer_impl_destroy(struct wl_client *client, struct wl_resource *wl_buffer)
 {
@@ -200,10 +254,15 @@ _wayland_tbm_server_buffer_destory(struct wl_resource *wl_buffer)
        if (tbm_buffer->destroy_cb)
                tbm_buffer->destroy_cb(tbm_buffer->surface, tbm_buffer->user_data);
 
-       tbm_surface_internal_set_debug_data(tbm_buffer->surface, "id", NULL);
-       tbm_surface_internal_set_debug_pid(tbm_buffer->surface, 0);
        wl_list_remove(&tbm_buffer->link_ref);
 
+       if (tbm_buffer->exported) {
+               _wayland_tbm_server_update_export_debug_id(tbm_buffer->surface);
+       } else {
+               tbm_surface_internal_set_debug_data(tbm_buffer->surface, "id  ", NULL);
+               tbm_surface_internal_set_debug_pid(tbm_buffer->surface, 0);
+       }
+
        if (tbm_buffer->sync_timeline != -1)
                close(tbm_buffer->sync_timeline);
 
@@ -222,7 +281,6 @@ _wayland_tbm_server_tbm_buffer_create(struct wl_resource *wl_tbm,
        struct wayland_tbm_buffer *tbm_buffer;
        struct wayland_tbm_user_data *ud;
        struct wl_client *wl_client;
-       pid_t pid;
 
        ud = _wayland_tbm_server_get_user_data(surface);
        WL_TBM_RETURN_VAL_IF_FAIL(ud != NULL, NULL);
@@ -253,11 +311,6 @@ _wayland_tbm_server_tbm_buffer_create(struct wl_resource *wl_tbm,
        tbm_buffer->surface = surface;
        tbm_buffer->client = wl_client;
        tbm_buffer->wl_tbm = wl_tbm;
-
-       /* set the debug_pid to the surface for debugging */
-       wl_client_get_credentials(wl_client, &pid, NULL, NULL);
-       tbm_surface_internal_set_debug_pid(surface, pid);
-
        tbm_buffer->sync_timeline = -1;
 
        return tbm_buffer;
@@ -279,7 +332,6 @@ _wayland_tbm_server_impl_create_buffer(struct wl_client *client,
        struct wayland_tbm_buffer *tbm_buffer;
        tbm_surface_info_s info = { 0, };
        tbm_bo bos[TBM_SURF_PLANE_MAX];
-       char debug_id[64] = {0, };
        tbm_surface_h surface;
        int i, numPlane;
 
@@ -331,8 +383,7 @@ _wayland_tbm_server_impl_create_buffer(struct wl_client *client,
                return;
        }
 
-       snprintf(debug_id, sizeof(debug_id), "%u", (unsigned int)wl_resource_get_id(tbm_buffer->wl_buffer));
-       tbm_surface_internal_set_debug_data(surface, "id", debug_id);
+       _wayland_tbm_server_set_debug_info(tbm_buffer);
 
 #ifdef DEBUG_TRACE
        pid_t pid;
@@ -358,7 +409,6 @@ _wayland_tbm_server_impl_create_buffer_with_fd(struct wl_client *client,
        struct wayland_tbm_buffer *tbm_buffer;
        tbm_surface_info_s info = { 0, };
        tbm_bo bos[TBM_SURF_PLANE_MAX];
-       char debug_id[64] = {0, };
        tbm_surface_h surface;
        int i, numPlane;
 
@@ -409,8 +459,7 @@ _wayland_tbm_server_impl_create_buffer_with_fd(struct wl_client *client,
                goto done;
        }
 
-       snprintf(debug_id, sizeof(debug_id), "%u", (unsigned int)wl_resource_get_id(tbm_buffer->wl_buffer));
-       tbm_surface_internal_set_debug_data(surface, "id", debug_id);
+       _wayland_tbm_server_set_debug_info(tbm_buffer);
 
 #ifdef DEBUG_TRACE
        pid_t pid;
@@ -929,7 +978,6 @@ wayland_tbm_server_export_buffer(struct wayland_tbm_server *tbm_srv,
                                                tbm_surface_h surface)
 {
        struct wayland_tbm_buffer *tbm_buffer;
-       char debug_id[64] = {0, };
 
        WL_TBM_RETURN_VAL_IF_FAIL(wl_tbm != NULL, NULL);
        WL_TBM_RETURN_VAL_IF_FAIL(surface != NULL, NULL);
@@ -952,9 +1000,9 @@ wayland_tbm_server_export_buffer(struct wayland_tbm_server *tbm_srv,
                return NULL;
        }
 
-       snprintf(debug_id, sizeof(debug_id), "%u",
-               (unsigned int)wl_resource_get_id(tbm_buffer->wl_buffer));
-       tbm_surface_internal_set_debug_data(surface, "id", debug_id);
+       tbm_buffer->exported = 1;
+
+       _wayland_tbm_server_update_export_debug_id(surface);
 
        return tbm_buffer->wl_buffer;
 }
@@ -1095,7 +1143,6 @@ wayland_tbm_server_client_queue_export_buffer2(
 {
        struct wayland_tbm_buffer *tbm_buffer;
        struct wl_resource *wl_tbm;
-       char debug_id[64] = {0, };
 
        WL_TBM_RETURN_VAL_IF_FAIL(cqueue != NULL, NULL);
        WL_TBM_RETURN_VAL_IF_FAIL(cqueue->wl_tbm_queue != NULL, NULL);
@@ -1117,6 +1164,7 @@ wayland_tbm_server_client_queue_export_buffer2(
        tbm_buffer->detach_cb = detach_cb;
        tbm_buffer->user_data = user_data;
        tbm_buffer->flags = flags;
+       tbm_buffer->exported = 1;
 
        if (!_wayland_tbm_server_export_surface(cqueue->wl_tbm,
                                                tbm_buffer->wl_buffer,
@@ -1128,9 +1176,8 @@ wayland_tbm_server_client_queue_export_buffer2(
 
        wl_tbm_queue_send_buffer_attached(cqueue->wl_tbm_queue,
                                                tbm_buffer->wl_buffer, flags);
-       snprintf(debug_id, sizeof(debug_id), "%u",
-               (unsigned int)wl_resource_get_id(tbm_buffer->wl_buffer));
-       tbm_surface_internal_set_debug_data(surface, "id", debug_id);
+
+       _wayland_tbm_server_update_export_debug_id(surface);
 
        return tbm_buffer->wl_buffer;
 }