From: "Anna (navi) Figueiredo Gomes" navi@vlhl.dev
mutex locking the data individually allows for two different HWND to have they data accessed at once. this is necessary to create a xdg_popup.
Signed-off-by: Anna (navi) Figueiredo Gomes navi@vlhl.dev --- dlls/winewayland.drv/waylanddrv.h | 1 + dlls/winewayland.drv/window.c | 23 ++++++++++++++++------- 2 files changed, 17 insertions(+), 7 deletions(-)
diff --git a/dlls/winewayland.drv/waylanddrv.h b/dlls/winewayland.drv/waylanddrv.h index d4ef01a8a1e..ae719a3d483 100644 --- a/dlls/winewayland.drv/waylanddrv.h +++ b/dlls/winewayland.drv/waylanddrv.h @@ -295,6 +295,7 @@ struct wayland_win_data /* USER client rectangle relative to win32 parent window client area */ RECT client_rect; BOOL managed; + pthread_mutex_t lock; };
struct wayland_win_data *wayland_win_data_get(HWND hwnd); diff --git a/dlls/winewayland.drv/window.c b/dlls/winewayland.drv/window.c index c1fb5c6e0b5..94bd580358b 100644 --- a/dlls/winewayland.drv/window.c +++ b/dlls/winewayland.drv/window.c @@ -101,12 +101,16 @@ static struct wayland_win_data *wayland_win_data_create(HWND hwnd, if ((rb_entry = rb_get(&win_data_rb, hwnd))) { free(data); - return RB_ENTRY_VALUE(rb_entry, struct wayland_win_data, entry); + data = RB_ENTRY_VALUE(rb_entry, struct wayland_win_data, entry); + } + else + { + rb_put(&win_data_rb, hwnd, &data->entry); } - - rb_put(&win_data_rb, hwnd, &data->entry);
TRACE("hwnd=%p\n", data->hwnd); + pthread_mutex_lock(&data->lock); + pthread_mutex_unlock(&win_data_mutex);
return data; } @@ -117,9 +121,11 @@ static struct wayland_win_data *wayland_win_data_create(HWND hwnd, static void wayland_win_data_destroy(struct wayland_win_data *data) { TRACE("hwnd=%p\n", data->hwnd); + pthread_mutex_lock(&win_data_mutex);
rb_remove(&win_data_rb, &data->entry);
+ pthread_mutex_unlock(&data->lock); pthread_mutex_unlock(&win_data_mutex);
if (data->window_surface) @@ -139,15 +145,18 @@ static void wayland_win_data_destroy(struct wayland_win_data *data) struct wayland_win_data *wayland_win_data_get(HWND hwnd) { struct rb_entry *rb_entry; + struct wayland_win_data *data = NULL;
pthread_mutex_lock(&win_data_mutex);
- if ((rb_entry = rb_get(&win_data_rb, hwnd))) - return RB_ENTRY_VALUE(rb_entry, struct wayland_win_data, entry); + if ((rb_entry = rb_get(&win_data_rb, hwnd))) { + data = RB_ENTRY_VALUE(rb_entry, struct wayland_win_data, entry); + pthread_mutex_lock(&data->lock); + }
pthread_mutex_unlock(&win_data_mutex);
- return NULL; + return data; }
/*********************************************************************** @@ -158,7 +167,7 @@ struct wayland_win_data *wayland_win_data_get(HWND hwnd) void wayland_win_data_release(struct wayland_win_data *data) { assert(data); - pthread_mutex_unlock(&win_data_mutex); + pthread_mutex_unlock(&data->lock); }
static void wayland_win_data_get_config(struct wayland_win_data *data,