tbm_drm_helper_server: separate tbm-drm-auth server from main thread 24/285524/2
authorChangyeon Lee <cyeon.lee@samsung.com>
Tue, 13 Dec 2022 12:10:55 +0000 (21:10 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Wed, 14 Dec 2022 05:47:24 +0000 (14:47 +0900)
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

index 177d1c7..94eb406 100644 (file)
@@ -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