wayland-client: Fix LOCK_EVASION issue 57/307257/3 accepted/tizen/unified/20240308.174110 accepted/tizen/unified/x/20240311.100015
authorJunkyeong Kim <jk0430.kim@samsung.com>
Wed, 6 Mar 2024 10:03:33 +0000 (19:03 +0900)
committerJunkyeong Kim <jk0430.kim@samsung.com>
Thu, 7 Mar 2024 08:42:36 +0000 (08:42 +0000)
error scenario

1. thread 1 check if (display->last_error).
2. thread 2 check if (display->last_error).
3. thread 2 acquire mutex.
4. thread 1 acquire mutex.
5. thread 2 modify display->last_error.
this makes LOCK_EVASION error.

to avoid LOCK_EVASION need mutex lock before checking display->last_error.

Change-Id: I61f565ce3dc54484f715d20304a2e9d43db9d001
Signed-off-by: Junkyeong Kim <jk0430.kim@samsung.com>
src/wayland-client.c

index bf1c96e..dfaa58f 100644 (file)
@@ -202,8 +202,15 @@ display_protocol_error(struct wl_display *display, uint32_t code,
 {
        int err;
 
-       if (display->last_error)
+       // TIZEN_ONLY(20240306) : fix LOCK_EVASION issue
+       pthread_mutex_lock(&display->mutex);
+       // TIZEN_ONLY : END
+       if (display->last_error) {
+               // TIZEN_ONLY(20240306) : fix LOCK_EVASION issue
+               pthread_mutex_unlock(&display->mutex);
+               // TIZEN_ONLY : END
                return;
+       }
 
        /* set correct errno */
        if (intf && wl_interface_equal(intf, &wl_display_interface)) {
@@ -225,7 +232,9 @@ display_protocol_error(struct wl_display *display, uint32_t code,
                err = EPROTO;
        }
 
-       pthread_mutex_lock(&display->mutex);
+       // TIZEN_ONLY(20240306) : fix LOCK_EVASION issue
+       //pthread_mutex_lock(&display->mutex);
+       // TIZEN_ONLY : END
 
        wl_log("[WL_LAST_ERROR_SET][FUNC:%s][LINE:%d] display:%p last_error (%d -> %d)\n", __FUNCTION__, __LINE__, display, display->last_error, err);
        display->last_error = err;