winex11: Use pthread for win data 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>
This commit is contained in:
Jacek Caban 2022-04-18 14:40:59 +02:00 committed by Alexandre Julliard
parent 83501c7eaa
commit fd83308b0b
3 changed files with 17 additions and 18 deletions

View File

@ -86,7 +86,7 @@ BOOL clipping_cursor = FALSE;
XContext winContext = 0; XContext winContext = 0;
/* X context to associate a struct x11drv_win_data to an hwnd */ /* X context to associate a struct x11drv_win_data to an hwnd */
XContext win_data_context = 0; static XContext win_data_context = 0;
/* time of last user event and window where it's stored */ /* time of last user event and window where it's stored */
static Time last_user_time; static Time last_user_time;
@ -99,14 +99,7 @@ static const WCHAR whole_window_prop[] =
static const WCHAR clip_window_prop[] = static const WCHAR clip_window_prop[] =
{'_','_','w','i','n','e','_','x','1','1','_','c','l','i','p','_','w','i','n','d','o','w',0}; {'_','_','w','i','n','e','_','x','1','1','_','c','l','i','p','_','w','i','n','d','o','w',0};
static CRITICAL_SECTION win_data_section; static pthread_mutex_t win_data_mutex = PTHREAD_MUTEX_INITIALIZER;
static CRITICAL_SECTION_DEBUG critsect_debug =
{
0, 0, &win_data_section,
{ &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList },
0, 0, { (DWORD_PTR)(__FILE__ ": win_data_section") }
};
static CRITICAL_SECTION win_data_section = { &critsect_debug, -1, 0, 0, 0, 0 };
/*********************************************************************** /***********************************************************************
@ -215,7 +208,7 @@ static struct x11drv_win_data *alloc_win_data( Display *display, HWND hwnd )
data->display = display; data->display = display;
data->vis = default_visual; data->vis = default_visual;
data->hwnd = hwnd; data->hwnd = hwnd;
EnterCriticalSection( &win_data_section ); pthread_mutex_lock( &win_data_mutex );
XSaveContext( gdi_display, (XID)hwnd, win_data_context, (char *)data ); XSaveContext( gdi_display, (XID)hwnd, win_data_context, (char *)data );
} }
return data; return data;
@ -1938,10 +1931,10 @@ struct x11drv_win_data *get_win_data( HWND hwnd )
char *data; char *data;
if (!hwnd) return NULL; if (!hwnd) return NULL;
EnterCriticalSection( &win_data_section ); pthread_mutex_lock( &win_data_mutex );
if (!XFindContext( gdi_display, (XID)hwnd, win_data_context, &data )) if (!XFindContext( gdi_display, (XID)hwnd, win_data_context, &data ))
return (struct x11drv_win_data *)data; return (struct x11drv_win_data *)data;
LeaveCriticalSection( &win_data_section ); pthread_mutex_unlock( &win_data_mutex );
return NULL; return NULL;
} }
@ -1953,7 +1946,7 @@ struct x11drv_win_data *get_win_data( HWND hwnd )
*/ */
void release_win_data( struct x11drv_win_data *data ) void release_win_data( struct x11drv_win_data *data )
{ {
if (data) LeaveCriticalSection( &win_data_section ); if (data) pthread_mutex_unlock( &win_data_mutex );
} }
@ -3039,3 +3032,12 @@ void X11DRV_FlashWindowEx( FLASHWINFO *pfinfo )
} }
release_win_data( data ); release_win_data( data );
} }
void init_win_context(void)
{
init_recursive_mutex( &win_data_mutex );
winContext = XUniqueContext();
win_data_context = XUniqueContext();
cursor_context = XUniqueContext();
}

View File

@ -661,6 +661,7 @@ extern void change_systray_owner( Display *display, Window systray_window ) DECL
extern void update_systray_balloon_position(void) DECLSPEC_HIDDEN; extern void update_systray_balloon_position(void) DECLSPEC_HIDDEN;
extern HWND create_foreign_window( Display *display, Window window ) DECLSPEC_HIDDEN; extern HWND create_foreign_window( Display *display, Window window ) DECLSPEC_HIDDEN;
extern BOOL update_clipboard( HWND hwnd ) DECLSPEC_HIDDEN; extern BOOL update_clipboard( HWND hwnd ) DECLSPEC_HIDDEN;
extern void init_win_context(void) DECLSPEC_HIDDEN;
static inline void mirror_rect( const RECT *window_rect, RECT *rect ) static inline void mirror_rect( const RECT *window_rect, RECT *rect )
{ {
@ -672,8 +673,6 @@ static inline void mirror_rect( const RECT *window_rect, RECT *rect )
/* X context to associate a hwnd to an X window */ /* X context to associate a hwnd to an X window */
extern XContext winContext DECLSPEC_HIDDEN; extern XContext winContext DECLSPEC_HIDDEN;
/* X context to associate a struct x11drv_win_data to an hwnd */
extern XContext win_data_context DECLSPEC_HIDDEN;
/* X context to associate an X cursor to a Win32 cursor handle */ /* X context to associate an X cursor to a Win32 cursor handle */
extern XContext cursor_context DECLSPEC_HIDDEN; extern XContext cursor_context DECLSPEC_HIDDEN;

View File

@ -683,9 +683,7 @@ static BOOL process_attach(void)
XInternAtoms( display, (char **)atom_names, NB_XATOMS - FIRST_XATOM, False, X11DRV_Atoms ); XInternAtoms( display, (char **)atom_names, NB_XATOMS - FIRST_XATOM, False, X11DRV_Atoms );
winContext = XUniqueContext(); init_win_context();
win_data_context = XUniqueContext();
cursor_context = XUniqueContext();
if (TRACE_ON(synchronous)) XSynchronize( display, True ); if (TRACE_ON(synchronous)) XSynchronize( display, True );