From baa3a82aa4761699847b70b09348189b92b789c9 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Tue, 13 Dec 2022 21:10:55 +0900 Subject: [PATCH] tbm_drm_helper_server: separate tbm-drm-auth server from main thread if main thread is busy, initializing tbm_bufmgr of client is delayed because wl_display_roundtrip is called twice to get authenticated DRM fd. this patch creates a new wl_display and runs thread of tbm-drm-auth socket. Change-Id: I5db513f2ab97a8ef81c8e621e9f27f455b4f6355 --- src/tbm_drm_helper_server.c | 105 +++++++++++++++++++++++++++++--------------- 1 file changed, 69 insertions(+), 36 deletions(-) diff --git a/src/tbm_drm_helper_server.c b/src/tbm_drm_helper_server.c index 177d1c7..94eb406 100644 --- a/src/tbm_drm_helper_server.c +++ b/src/tbm_drm_helper_server.c @@ -43,6 +43,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. struct wayland_tbm_drm_auth_server { struct wl_display *display; struct wl_global *wl_tbm_drm_auth_global; + pthread_t thread; char *device_name; uint32_t fd; @@ -108,6 +109,9 @@ _send_server_auth_info(struct wayland_tbm_drm_auth_server *tbm_drm_auth_srv, /* send */ wl_tbm_drm_auth_send_authentication_info(resource, device_name, capabilities, fd); + TBM_INFO("Send tbm drm auth info fd:%d device_name:%s capabilities:%x", + fd, device_name, capabilities); + fini: if (fd >= 0) close(fd); @@ -247,62 +251,91 @@ _tbm_drm_auth_socket_init(struct wayland_tbm_drm_auth_server *tbm_drm_auth_srv) } } +static void * +_tbm_drm_auth_main(void *data) +{ + wl_display_run(tbm_drm_auth_srv->display); + pthread_exit(NULL); +} + int tbm_drm_helper_wl_auth_server_init(void *wl_display, int fd, const char *device_name, uint32_t flags) { - if (!tbm_drm_auth_srv) { - TBM_RETURN_VAL_IF_FAIL(wl_display != NULL, 0); - - tbm_drm_auth_srv = calloc(1, sizeof(struct wayland_tbm_drm_auth_server)); - TBM_RETURN_VAL_IF_FAIL(tbm_drm_auth_srv != NULL, 0); - - tbm_drm_auth_srv->display = (struct wl_display *)wl_display; - if (!device_name) { - tbm_drm_auth_srv->device_name = drmGetDeviceNameFromFd(fd); - if (!tbm_drm_auth_srv->device_name) { - TBM_ERR("fail to get device name!\n"); - return 0; - } - } else { - tbm_drm_auth_srv->device_name = strdup(device_name); - } - tbm_drm_auth_srv->fd = fd; - tbm_drm_auth_srv->flags = flags; + int ret; - if (wl_display_add_socket(tbm_drm_auth_srv->display, "tbm-drm-auth")) { - TBM_ERR("[TBM_DRM] fail to add socket\n"); + if (tbm_drm_auth_srv) return 1; - if (tbm_drm_auth_srv->device_name) - free(tbm_drm_auth_srv->device_name); + tbm_drm_auth_srv = calloc(1, sizeof(struct wayland_tbm_drm_auth_server)); + TBM_RETURN_VAL_IF_FAIL(tbm_drm_auth_srv != NULL, 0); - free(tbm_drm_auth_srv); - tbm_drm_auth_srv = NULL; + tbm_drm_auth_srv->display = wl_display_create(); + if (!tbm_drm_auth_srv->display) { + TBM_ERR("fail to create wl_display"); + goto fail; + } - return 0; + if (!device_name) { + tbm_drm_auth_srv->device_name = drmGetDeviceNameFromFd(fd); + if (!tbm_drm_auth_srv->device_name) { + TBM_ERR("fail to get device name"); + goto fail; } + } else { + tbm_drm_auth_srv->device_name = strdup(device_name); + } + + tbm_drm_auth_srv->fd = fd; + tbm_drm_auth_srv->flags = flags; + + if (wl_display_add_socket(tbm_drm_auth_srv->display, "tbm-drm-auth")) { + TBM_ERR("[TBM_DRM] fail to add socket"); + goto fail; + } + + _tbm_drm_auth_socket_init(tbm_drm_auth_srv); - _tbm_drm_auth_socket_init(tbm_drm_auth_srv); + /* init the client resource list */ + tbm_drm_auth_srv->wl_tbm_drm_auth_global = wl_global_create(tbm_drm_auth_srv->display, &wl_tbm_drm_auth_interface, 1, + tbm_drm_auth_srv, _wayland_tbm_drm_auth_server_bind_cb); - /* init the client resource list */ - tbm_drm_auth_srv->wl_tbm_drm_auth_global = wl_global_create(tbm_drm_auth_srv->display, &wl_tbm_drm_auth_interface, 1, - tbm_drm_auth_srv, _wayland_tbm_drm_auth_server_bind_cb); + ret = pthread_create(&tbm_drm_auth_srv->thread, NULL, _tbm_drm_auth_main, NULL); + if (ret != 0) { + TBM_ERR("fail to create auth thread err:%d", ret); + goto fail; } return 1; + +fail: + if (tbm_drm_auth_srv->display) + wl_display_destroy(tbm_drm_auth_srv->display); + + if (tbm_drm_auth_srv->device_name) + free(tbm_drm_auth_srv->device_name); + + free(tbm_drm_auth_srv); + tbm_drm_auth_srv = NULL; + + return 0; } void tbm_drm_helper_wl_auth_server_deinit(void) { - if (tbm_drm_auth_srv) { - wl_global_destroy(tbm_drm_auth_srv->wl_tbm_drm_auth_global); + if (!tbm_drm_auth_srv) return; - if (tbm_drm_auth_srv->device_name) - free(tbm_drm_auth_srv->device_name); + wl_display_terminate(tbm_drm_auth_srv->display); + pthread_join(tbm_drm_auth_srv->thread, NULL); - free(tbm_drm_auth_srv); - tbm_drm_auth_srv = NULL; - } + wl_global_destroy(tbm_drm_auth_srv->wl_tbm_drm_auth_global); + + wl_display_destroy(tbm_drm_auth_srv->display); + + if (tbm_drm_auth_srv->device_name) + free(tbm_drm_auth_srv->device_name); + + free(tbm_drm_auth_srv); + tbm_drm_auth_srv = NULL; } int -- 2.7.4