Module: wine Branch: master Commit: e395c161edf239bbe8055c2237857a44d2fe9b04 URL: https://source.winehq.org/git/wine.git/?a=commit;h=e395c161edf239bbe8055c223...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Apr 18 14:40:26 2022 +0200
winex11: Use pthread for surface locking.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/winex11.drv/Makefile.in | 2 +- dlls/winex11.drv/bitblt.c | 11 ++++------- dlls/winex11.drv/init.c | 12 ++++++++++++ dlls/winex11.drv/x11drv.h | 2 ++ 4 files changed, 19 insertions(+), 8 deletions(-)
diff --git a/dlls/winex11.drv/Makefile.in b/dlls/winex11.drv/Makefile.in index b6b1062c425..ff2e38d64a7 100644 --- a/dlls/winex11.drv/Makefile.in +++ b/dlls/winex11.drv/Makefile.in @@ -3,7 +3,7 @@ MODULE = winex11.drv IMPORTS = uuid user32 gdi32 win32u DELAYIMPORTS = comctl32 ole32 shell32 imm32 EXTRAINCL = $(X_CFLAGS) -EXTRALIBS = $(X_LIBS) $(X_EXTRA_LIBS) +EXTRALIBS = $(X_LIBS) $(X_EXTRA_LIBS) $(PTHREAD_LIBS)
EXTRADLLFLAGS = -mcygwin
diff --git a/dlls/winex11.drv/bitblt.c b/dlls/winex11.drv/bitblt.c index bae0784be78..963fde035da 100644 --- a/dlls/winex11.drv/bitblt.c +++ b/dlls/winex11.drv/bitblt.c @@ -1583,7 +1583,7 @@ struct x11drv_window_surface #ifdef HAVE_LIBXXSHM XShmSegmentInfo shminfo; #endif - CRITICAL_SECTION crit; + pthread_mutex_t mutex; BITMAPINFO info; /* variable size, must be last */ };
@@ -1831,7 +1831,7 @@ static void x11drv_surface_lock( struct window_surface *window_surface ) { struct x11drv_window_surface *surface = get_x11_surface( window_surface );
- EnterCriticalSection( &surface->crit ); + pthread_mutex_lock( &surface->mutex ); }
/*********************************************************************** @@ -1841,7 +1841,7 @@ static void x11drv_surface_unlock( struct window_surface *window_surface ) { struct x11drv_window_surface *surface = get_x11_surface( window_surface );
- LeaveCriticalSection( &surface->crit ); + pthread_mutex_unlock( &surface->mutex ); }
/*********************************************************************** @@ -1987,8 +1987,6 @@ static void x11drv_surface_destroy( struct window_surface *window_surface ) surface->image->data = NULL; XDestroyImage( surface->image ); } - surface->crit.DebugInfo->Spare[0] = 0; - DeleteCriticalSection( &surface->crit ); if (surface->region) NtGdiDeleteObjectApp( surface->region ); HeapFree( GetProcessHeap(), 0, surface ); } @@ -2026,8 +2024,7 @@ struct window_surface *create_surface( Window window, const XVisualInfo *vis, co surface->info.bmiHeader.biSizeImage = get_dib_image_size( &surface->info ); if (format->bits_per_pixel > 8) set_color_info( vis, &surface->info, use_alpha );
- InitializeCriticalSection( &surface->crit ); - surface->crit.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": surface"); + init_recursive_mutex( &surface->mutex );
surface->header.funcs = &x11drv_surface_funcs; surface->header.rect = *rect; diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c index 8f4bb9fd7e9..3447e7bc69f 100644 --- a/dlls/winex11.drv/init.c +++ b/dlls/winex11.drv/init.c @@ -42,6 +42,18 @@ static INIT_ONCE init_once = INIT_ONCE_STATIC_INIT; static const struct user_driver_funcs x11drv_funcs; static const struct gdi_dc_funcs *xrender_funcs;
+ +void init_recursive_mutex( pthread_mutex_t *mutex ) +{ + pthread_mutexattr_t attr; + + pthread_mutexattr_init( &attr ); + pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_RECURSIVE ); + pthread_mutex_init( mutex, &attr ); + pthread_mutexattr_destroy( &attr ); +} + + /********************************************************************** * device_init * diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 07c36899eb3..ed7a75a8d17 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -28,6 +28,7 @@
#include <limits.h> #include <stdarg.h> +#include <pthread.h> #include <X11/Xlib.h> #include <X11/Xresource.h> #include <X11/Xutil.h> @@ -702,6 +703,7 @@ extern POINT root_to_virtual_screen( INT x, INT y ) DECLSPEC_HIDDEN; extern RECT get_host_primary_monitor_rect(void) DECLSPEC_HIDDEN; extern RECT get_work_area( const RECT *monitor_rect ) DECLSPEC_HIDDEN; extern void xinerama_init( unsigned int width, unsigned int height ) DECLSPEC_HIDDEN; +extern void init_recursive_mutex( pthread_mutex_t *mutex ) DECLSPEC_HIDDEN;
#define DEPTH_COUNT 3 extern const unsigned int *depths DECLSPEC_HIDDEN;