From: Grigory Vasilyev h0tc0d3@gmail.com
--- dlls/win32u/class.c | 7 +-- dlls/win32u/clipboard.c | 31 +++++++------ dlls/win32u/d3dkmt.c | 49 ++++++++++---------- dlls/win32u/dc.c | 11 +++-- dlls/win32u/dce.c | 27 +++++++---- dlls/win32u/dibdrv/graphics.c | 9 ++-- dlls/win32u/font.c | 87 ++++++++++++++++++----------------- dlls/win32u/gdiobj.c | 63 ++++++++++++------------- dlls/win32u/imm.c | 35 +++++++------- dlls/win32u/rawinput.c | 31 +++++++------ dlls/win32u/sysparams.c | 41 ++++++++--------- dlls/win32u/winstation.c | 9 ++-- include/wine/gdi_driver.h | 3 +- 13 files changed, 207 insertions(+), 196 deletions(-)
diff --git a/dlls/win32u/class.c b/dlls/win32u/class.c index 33baed3dc23..733b8287832 100644 --- a/dlls/win32u/class.c +++ b/dlls/win32u/class.c @@ -30,6 +30,7 @@ #define WIN32_NO_STATUS #include "win32u_private.h" #include "ntuser_private.h" +#include "wine/mutex.h" #include "wine/server.h" #include "wine/debug.h"
@@ -79,7 +80,7 @@ typedef struct tagWINDOWPROC
static WINDOWPROC winproc_array[MAX_WINPROCS]; static UINT winproc_used = NB_BUILTIN_WINPROCS; -static pthread_mutex_t winproc_lock = PTHREAD_MUTEX_INITIALIZER; +static WINE_MUTEX_TYPE winproc_lock = WINE_MUTEX_INIT;
static struct list class_list = LIST_INIT( class_list );
@@ -132,7 +133,7 @@ static inline WINDOWPROC *alloc_winproc_ptr( WNDPROC func, BOOL ansi ) if (!func) return NULL; if ((proc = get_winproc_ptr( func ))) return proc;
- pthread_mutex_lock( &winproc_lock ); + WINE_MUTEX_LOCK( &winproc_lock );
/* check if we already have a winproc for that function */ if (!(proc = find_winproc( func, ansi ))) @@ -150,7 +151,7 @@ static inline WINDOWPROC *alloc_winproc_ptr( WNDPROC func, BOOL ansi ) } else TRACE_(win)( "reusing %p for %p\n", proc_to_handle(proc), func );
- pthread_mutex_unlock( &winproc_lock ); + WINE_MUTEX_UNLOCK( &winproc_lock ); return proc; }
diff --git a/dlls/win32u/clipboard.c b/dlls/win32u/clipboard.c index 6cf484a56ca..7e37b04c54d 100644 --- a/dlls/win32u/clipboard.c +++ b/dlls/win32u/clipboard.c @@ -33,12 +33,13 @@ #include "win32u_private.h" #include "ntgdi_private.h" #include "ntuser_private.h" +#include "wine/mutex.h" #include "wine/server.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(clipboard);
-static pthread_mutex_t clipboard_mutex = PTHREAD_MUTEX_INITIALIZER; +static WINE_MUTEX_TYPE clipboard_mutex = WINE_MUTEX_INIT;
struct cached_format { @@ -179,7 +180,7 @@ BOOL WINAPI NtUserOpenClipboard( HWND hwnd, ULONG unk )
user_driver->pUpdateClipboard();
- pthread_mutex_lock( &clipboard_mutex ); + WINE_MUTEX_LOCK( &clipboard_mutex );
SERVER_START_REQ( open_clipboard ) { @@ -191,7 +192,7 @@ BOOL WINAPI NtUserOpenClipboard( HWND hwnd, ULONG unk )
if (ret && !is_current_process_window( owner )) invalidate_memory_formats( &free_list );
- pthread_mutex_unlock( &clipboard_mutex ); + WINE_MUTEX_UNLOCK( &clipboard_mutex ); free_cached_formats( &free_list ); return ret; } @@ -235,7 +236,7 @@ BOOL WINAPI NtUserEmptyClipboard(void) if (owner) send_message_timeout( owner, WM_DESTROYCLIPBOARD, 0, 0, SMTO_ABORTIFHUNG, 5000, FALSE );
- pthread_mutex_lock( &clipboard_mutex ); + WINE_MUTEX_LOCK( &clipboard_mutex );
SERVER_START_REQ( empty_clipboard ) { @@ -249,7 +250,7 @@ BOOL WINAPI NtUserEmptyClipboard(void) list_move_tail( &free_list, &cached_formats ); }
- pthread_mutex_unlock( &clipboard_mutex ); + WINE_MUTEX_UNLOCK( &clipboard_mutex ); free_cached_formats( &free_list ); return ret; } @@ -579,12 +580,12 @@ NTSTATUS WINAPI NtUserSetClipboardData( UINT format, HANDLE data, struct set_cli
if (params->cache_only) { - pthread_mutex_lock( &clipboard_mutex ); + WINE_MUTEX_LOCK( &clipboard_mutex ); if ((cache = get_cached_format( format )) && cache->seqno == params->seqno) cache->handle = data; else status = STATUS_UNSUCCESSFUL; - pthread_mutex_unlock( &clipboard_mutex ); + WINE_MUTEX_UNLOCK( &clipboard_mutex ); return status; }
@@ -606,7 +607,7 @@ NTSTATUS WINAPI NtUserSetClipboardData( UINT format, HANDLE data, struct set_cli } NtQueryDefaultLocale( TRUE, &lcid );
- pthread_mutex_lock( &clipboard_mutex ); + WINE_MUTEX_LOCK( &clipboard_mutex );
SERVER_START_REQ( set_clipboard_data ) { @@ -628,7 +629,7 @@ NTSTATUS WINAPI NtUserSetClipboardData( UINT format, HANDLE data, struct set_cli } else free( cache );
- pthread_mutex_unlock( &clipboard_mutex ); + WINE_MUTEX_UNLOCK( &clipboard_mutex ); if (prev) free_cached_data( prev );
done: @@ -649,7 +650,7 @@ HANDLE WINAPI NtUserGetClipboardData( UINT format, struct get_clipboard_params *
for (;;) { - pthread_mutex_lock( &clipboard_mutex ); + WINE_MUTEX_LOCK( &clipboard_mutex );
if (!params->data_only) cache = get_cached_format( format );
@@ -680,7 +681,7 @@ HANDLE WINAPI NtUserGetClipboardData( UINT format, struct get_clipboard_params * if (cache->handle && data_seqno == cache->seqno) /* we can reuse the cached data */ { HANDLE ret = cache->handle; - pthread_mutex_unlock( &clipboard_mutex ); + WINE_MUTEX_UNLOCK( &clipboard_mutex ); TRACE( "%s returning %p\n", debugstr_format( format ), ret ); return ret; } @@ -692,14 +693,14 @@ HANDLE WINAPI NtUserGetClipboardData( UINT format, struct get_clipboard_params *
if (params->data_only) { - pthread_mutex_unlock( &clipboard_mutex ); + WINE_MUTEX_UNLOCK( &clipboard_mutex ); return params->data; }
/* allocate new cache entry */ if (!(cache = malloc( sizeof(*cache) ))) { - pthread_mutex_unlock( &clipboard_mutex ); + WINE_MUTEX_UNLOCK( &clipboard_mutex ); return 0; }
@@ -708,12 +709,12 @@ HANDLE WINAPI NtUserGetClipboardData( UINT format, struct get_clipboard_params * cache->handle = NULL; params->seqno = cache->seqno; list_add_tail( &cached_formats, &cache->entry ); - pthread_mutex_unlock( &clipboard_mutex ); + WINE_MUTEX_UNLOCK( &clipboard_mutex ); TRACE( "%s needs unmarshaling\n", debugstr_format( format ) ); params->data_size = ~0; return 0; } - pthread_mutex_unlock( &clipboard_mutex ); + WINE_MUTEX_UNLOCK( &clipboard_mutex );
if (status == STATUS_BUFFER_OVERFLOW) { diff --git a/dlls/win32u/d3dkmt.c b/dlls/win32u/d3dkmt.c index d6eedc44a9b..b7105f193e9 100644 --- a/dlls/win32u/d3dkmt.c +++ b/dlls/win32u/d3dkmt.c @@ -29,6 +29,7 @@ #include "ntgdi_private.h" #include "win32u_private.h" #include "ntuser_private.h" +#include "wine/mutex.h" #include "wine/vulkan.h" #include "wine/vulkan_driver.h"
@@ -55,7 +56,7 @@ struct d3dkmt_vidpn_source struct list entry; /* List entry */ };
-static pthread_mutex_t d3dkmt_lock = PTHREAD_MUTEX_INITIALIZER; +static WINE_MUTEX_TYPE d3dkmt_lock = WINE_MUTEX_INIT; static struct list d3dkmt_adapters = LIST_INIT( d3dkmt_adapters ); static struct list d3dkmt_devices = LIST_INIT( d3dkmt_devices ); static struct list d3dkmt_vidpn_sources = LIST_INIT( d3dkmt_vidpn_sources ); /* VidPN source information list */ @@ -158,13 +159,13 @@ NTSTATUS WINAPI NtGdiDdDDICloseAdapter( const D3DKMT_CLOSEADAPTER *desc )
if (!desc || !desc->hAdapter) return STATUS_INVALID_PARAMETER;
- pthread_mutex_lock( &d3dkmt_lock ); + WINE_MUTEX_LOCK( &d3dkmt_lock ); if ((adapter = find_adapter_from_handle( desc->hAdapter ))) { list_remove( &adapter->entry ); status = STATUS_SUCCESS; } - pthread_mutex_unlock( &d3dkmt_lock ); + WINE_MUTEX_UNLOCK( &d3dkmt_lock );
free( adapter ); return status; @@ -256,10 +257,10 @@ NTSTATUS WINAPI NtGdiDdDDIOpenAdapterFromLuid( D3DKMT_OPENADAPTERFROMLUID *desc else if (!(adapter->vk_device = get_vulkan_physical_device( &uuid ))) WARN( "Failed to find vulkan device with GUID %s\n", debugstr_guid( &uuid ) );
- pthread_mutex_lock( &d3dkmt_lock ); + WINE_MUTEX_LOCK( &d3dkmt_lock ); desc->hAdapter = adapter->handle = ++handle_start; list_add_tail( &d3dkmt_adapters, &adapter->entry ); - pthread_mutex_unlock( &d3dkmt_lock ); + WINE_MUTEX_UNLOCK( &d3dkmt_lock );
return STATUS_SUCCESS; } @@ -277,9 +278,9 @@ NTSTATUS WINAPI NtGdiDdDDICreateDevice( D3DKMT_CREATEDEVICE *desc )
if (!desc) return STATUS_INVALID_PARAMETER;
- pthread_mutex_lock( &d3dkmt_lock ); + WINE_MUTEX_LOCK( &d3dkmt_lock ); found = !!find_adapter_from_handle( desc->hAdapter ); - pthread_mutex_unlock( &d3dkmt_lock ); + WINE_MUTEX_UNLOCK( &d3dkmt_lock );
if (!found) return STATUS_INVALID_PARAMETER;
@@ -289,10 +290,10 @@ NTSTATUS WINAPI NtGdiDdDDICreateDevice( D3DKMT_CREATEDEVICE *desc ) device = calloc( 1, sizeof(*device) ); if (!device) return STATUS_NO_MEMORY;
- pthread_mutex_lock( &d3dkmt_lock ); + WINE_MUTEX_LOCK( &d3dkmt_lock ); device->handle = ++handle_start; list_add_tail( &d3dkmt_devices, &device->entry ); - pthread_mutex_unlock( &d3dkmt_lock ); + WINE_MUTEX_UNLOCK( &d3dkmt_lock );
desc->hDevice = device->handle; return STATUS_SUCCESS; @@ -310,7 +311,7 @@ NTSTATUS WINAPI NtGdiDdDDIDestroyDevice( const D3DKMT_DESTROYDEVICE *desc )
if (!desc || !desc->hDevice) return STATUS_INVALID_PARAMETER;
- pthread_mutex_lock( &d3dkmt_lock ); + WINE_MUTEX_LOCK( &d3dkmt_lock ); LIST_FOR_EACH_ENTRY( device, &d3dkmt_devices, struct d3dkmt_device, entry ) { if (device->handle == desc->hDevice) @@ -320,7 +321,7 @@ NTSTATUS WINAPI NtGdiDdDDIDestroyDevice( const D3DKMT_DESTROYDEVICE *desc ) break; } } - pthread_mutex_unlock( &d3dkmt_lock ); + WINE_MUTEX_UNLOCK( &d3dkmt_lock );
if (!found) return STATUS_INVALID_PARAMETER;
@@ -382,7 +383,7 @@ NTSTATUS WINAPI NtGdiDdDDIQueryVideoMemoryInfo( D3DKMT_QUERYVIDEOMEMORYINFO *des desc->CurrentReservation = 0; desc->AvailableForReservation = 0;
- pthread_mutex_lock( &d3dkmt_lock ); + WINE_MUTEX_LOCK( &d3dkmt_lock ); if ((adapter = find_adapter_from_handle( desc->hAdapter )) && adapter->vk_device) { memset( &budget, 0, sizeof(budget) ); @@ -403,7 +404,7 @@ NTSTATUS WINAPI NtGdiDdDDIQueryVideoMemoryInfo( D3DKMT_QUERYVIDEOMEMORYINFO *des } desc->AvailableForReservation = desc->Budget / 2; } - pthread_mutex_unlock( &d3dkmt_lock ); + WINE_MUTEX_UNLOCK( &d3dkmt_lock );
return adapter ? STATUS_SUCCESS : STATUS_INVALID_PARAMETER; } @@ -431,7 +432,7 @@ NTSTATUS WINAPI NtGdiDdDDISetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER if (!desc || !desc->hDevice || (desc->VidPnSourceCount && (!desc->pType || !desc->pVidPnSourceId))) return STATUS_INVALID_PARAMETER;
- pthread_mutex_lock( &d3dkmt_lock ); + WINE_MUTEX_LOCK( &d3dkmt_lock );
/* Check parameters */ for (i = 0; i < desc->VidPnSourceCount; ++i) @@ -449,7 +450,7 @@ NTSTATUS WINAPI NtGdiDdDDISetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER (source->type == D3DKMT_VIDPNSOURCEOWNER_EMULATED && desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE)) { - pthread_mutex_unlock( &d3dkmt_lock ); + WINE_MUTEX_UNLOCK( &d3dkmt_lock ); return STATUS_INVALID_PARAMETER; } } @@ -460,7 +461,7 @@ NTSTATUS WINAPI NtGdiDdDDISetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER (desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE || desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_EMULATED)) { - pthread_mutex_unlock( &d3dkmt_lock ); + WINE_MUTEX_UNLOCK( &d3dkmt_lock ); return STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE; } } @@ -471,14 +472,14 @@ NTSTATUS WINAPI NtGdiDdDDISetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER * D3DKMT_VIDPNSOURCEOWNER_SHARED come back STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE */ if (desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_SHARED) { - pthread_mutex_unlock( &d3dkmt_lock ); + WINE_MUTEX_UNLOCK( &d3dkmt_lock ); return STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE; }
/* FIXME: D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVEGDI unsupported */ if (desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVEGDI || desc->pType[i] > D3DKMT_VIDPNSOURCEOWNER_EMULATED) { - pthread_mutex_unlock( &d3dkmt_lock ); + WINE_MUTEX_UNLOCK( &d3dkmt_lock ); return STATUS_INVALID_PARAMETER; } } @@ -495,7 +496,7 @@ NTSTATUS WINAPI NtGdiDdDDISetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER } }
- pthread_mutex_unlock( &d3dkmt_lock ); + WINE_MUTEX_UNLOCK( &d3dkmt_lock ); return STATUS_SUCCESS; }
@@ -518,7 +519,7 @@ NTSTATUS WINAPI NtGdiDdDDISetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER source = malloc( sizeof(*source) ); if (!source) { - pthread_mutex_unlock( &d3dkmt_lock ); + WINE_MUTEX_UNLOCK( &d3dkmt_lock ); return STATUS_NO_MEMORY; }
@@ -529,7 +530,7 @@ NTSTATUS WINAPI NtGdiDdDDISetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER } }
- pthread_mutex_unlock( &d3dkmt_lock ); + WINE_MUTEX_UNLOCK( &d3dkmt_lock ); return STATUS_SUCCESS; }
@@ -544,18 +545,18 @@ NTSTATUS WINAPI NtGdiDdDDICheckVidPnExclusiveOwnership( const D3DKMT_CHECKVIDPNE
if (!desc || !desc->hAdapter) return STATUS_INVALID_PARAMETER;
- pthread_mutex_lock( &d3dkmt_lock ); + WINE_MUTEX_LOCK( &d3dkmt_lock );
LIST_FOR_EACH_ENTRY( source, &d3dkmt_vidpn_sources, struct d3dkmt_vidpn_source, entry ) { if (source->id == desc->VidPnSourceId && source->type == D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE) { - pthread_mutex_unlock( &d3dkmt_lock ); + WINE_MUTEX_UNLOCK( &d3dkmt_lock ); return STATUS_GRAPHICS_PRESENT_OCCLUDED; } }
- pthread_mutex_unlock( &d3dkmt_lock ); + WINE_MUTEX_UNLOCK( &d3dkmt_lock ); return STATUS_SUCCESS; }
diff --git a/dlls/win32u/dc.c b/dlls/win32u/dc.c index 24a3bca5544..fccdbac61f7 100644 --- a/dlls/win32u/dc.c +++ b/dlls/win32u/dc.c @@ -36,6 +36,7 @@ #include "winternl.h" #include "winerror.h" #include "ntgdi_private.h" +#include "wine/mutex.h" #include "wine/wgl.h" #include "wine/wgl_driver.h"
@@ -43,7 +44,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(dc);
-static pthread_mutex_t dc_attr_lock = PTHREAD_MUTEX_INITIALIZER; +static WINE_MUTEX_TYPE dc_attr_lock = WINE_MUTEX_INIT;
struct dc_attr_bucket { @@ -90,7 +91,7 @@ static DC_ATTR *alloc_dc_attr(void) struct dc_attr_bucket *bucket; DC_ATTR *dc_attr = NULL;
- pthread_mutex_lock( &dc_attr_lock ); + WINE_MUTEX_LOCK( &dc_attr_lock );
LIST_FOR_EACH_ENTRY( bucket, &dc_attr_buckets, struct dc_attr_bucket, entry ) { @@ -125,7 +126,7 @@ static DC_ATTR *alloc_dc_attr(void)
if (dc_attr) memset( dc_attr, 0, sizeof( *dc_attr ));
- pthread_mutex_unlock( &dc_attr_lock ); + WINE_MUTEX_UNLOCK( &dc_attr_lock );
return dc_attr; } @@ -135,7 +136,7 @@ static void free_dc_attr( DC_ATTR *dc_attr ) { struct dc_attr_bucket *bucket;
- pthread_mutex_lock( &dc_attr_lock ); + WINE_MUTEX_LOCK( &dc_attr_lock );
LIST_FOR_EACH_ENTRY( bucket, &dc_attr_buckets, struct dc_attr_bucket, entry ) { @@ -145,7 +146,7 @@ static void free_dc_attr( DC_ATTR *dc_attr ) break; }
- pthread_mutex_unlock( &dc_attr_lock ); + WINE_MUTEX_UNLOCK( &dc_attr_lock ); }
diff --git a/dlls/win32u/dce.c b/dlls/win32u/dce.c index aa6836e3440..4824b6a157b 100644 --- a/dlls/win32u/dce.c +++ b/dlls/win32u/dce.c @@ -30,6 +30,7 @@ #include "ntgdi_private.h" #include "ntuser_private.h" #include "wine/server.h" +#include "wine/mutex.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(win); @@ -50,7 +51,7 @@ static struct list dce_list = LIST_INIT(dce_list); #define DCE_CACHE_SIZE 64
static struct list window_surfaces = LIST_INIT( window_surfaces ); -static pthread_mutex_t surfaces_lock = PTHREAD_MUTEX_INITIALIZER; +static WINE_MUTEX_TYPE surfaces_lock = WINE_MUTEX_INIT;
/******************************************************************* * Dummy window surface for windows that shouldn't get painted. @@ -86,7 +87,7 @@ struct window_surface dummy_surface = .funcs = &dummy_surface_funcs, .ref = 1, .rect = {.right = 1, .bottom = 1}, - .mutex = PTHREAD_MUTEX_INITIALIZER, + .mutex = WINE_MUTEX_INIT, };
/******************************************************************* @@ -355,7 +356,13 @@ W32KAPI BOOL window_surface_init( struct window_surface *surface, const struct w surface->color_key = CLR_INVALID; surface->alpha_bits = -1; surface->alpha_mask = 0; - pthread_mutex_init( &surface->mutex, NULL ); + +#ifdef WINE_USE_ATOMIC_LOCKS + atomic_store(&surface->mutex, 0); +#else + pthread_mutex_init(&surface->mutex, NULL); +#endif + reset_bounds( &surface->bounds );
if (!bitmap) bitmap = NtGdiCreateDIBSection( 0, NULL, 0, info, DIB_RGB_COLORS, 0, 0, 0, NULL ); @@ -374,7 +381,7 @@ W32KAPI void window_surface_release( struct window_surface *surface ) ULONG ret = InterlockedDecrement( &surface->ref ); if (!ret) { - if (surface != &dummy_surface) pthread_mutex_destroy( &surface->mutex ); + if (surface != &dummy_surface) WINE_MUTEX_DESTROY( &surface->mutex ); if (surface->clip_region) NtGdiDeleteObjectApp( surface->clip_region ); if (surface->color_bitmap) NtGdiDeleteObjectApp( surface->color_bitmap ); if (surface->shape_bitmap) NtGdiDeleteObjectApp( surface->shape_bitmap ); @@ -385,13 +392,13 @@ W32KAPI void window_surface_release( struct window_surface *surface ) W32KAPI void window_surface_lock( struct window_surface *surface ) { if (surface == &dummy_surface) return; - pthread_mutex_lock( &surface->mutex ); + WINE_MUTEX_LOCK( &surface->mutex ); }
W32KAPI void window_surface_unlock( struct window_surface *surface ) { if (surface == &dummy_surface) return; - pthread_mutex_unlock( &surface->mutex ); + WINE_MUTEX_UNLOCK( &surface->mutex ); }
void *window_surface_get_color( struct window_surface *surface, BITMAPINFO *info ) @@ -548,10 +555,10 @@ void register_window_surface( struct window_surface *old, struct window_surface if (old == &dummy_surface) old = NULL; if (new == &dummy_surface) new = NULL; if (old == new) return; - pthread_mutex_lock( &surfaces_lock ); + WINE_MUTEX_LOCK( &surfaces_lock ); if (old) list_remove( &old->entry ); if (new) list_add_tail( &window_surfaces, &new->entry ); - pthread_mutex_unlock( &surfaces_lock ); + WINE_MUTEX_UNLOCK( &surfaces_lock ); }
/******************************************************************* @@ -565,7 +572,7 @@ void flush_window_surfaces( BOOL idle ) DWORD now; struct window_surface *surface;
- pthread_mutex_lock( &surfaces_lock ); + WINE_MUTEX_LOCK( &surfaces_lock ); now = NtGetTickCount(); if (idle) last_idle = now; /* if not idle, we only flush if there's evidence that the app never goes idle */ @@ -574,7 +581,7 @@ void flush_window_surfaces( BOOL idle ) LIST_FOR_EACH_ENTRY( surface, &window_surfaces, struct window_surface, entry ) window_surface_flush( surface ); done: - pthread_mutex_unlock( &surfaces_lock ); + WINE_MUTEX_UNLOCK( &surfaces_lock ); }
/*********************************************************************** diff --git a/dlls/win32u/dibdrv/graphics.c b/dlls/win32u/dibdrv/graphics.c index 009143bc2d2..def42099425 100644 --- a/dlls/win32u/dibdrv/graphics.c +++ b/dlls/win32u/dibdrv/graphics.c @@ -27,6 +27,7 @@ #include "ntgdi_private.h" #include "dibdrv.h"
+#include "wine/mutex.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(dib); @@ -60,7 +61,7 @@ struct cached_font
static struct list font_cache = LIST_INIT( font_cache );
-static pthread_mutex_t font_cache_lock = PTHREAD_MUTEX_INITIALIZER; +static WINE_MUTEX_TYPE font_cache_lock = WINE_MUTEX_INIT;
static BOOL brush_rect( dibdrv_physdev *pdev, dib_brush *brush, const RECT *rect, HRGN clip ) @@ -569,7 +570,7 @@ static struct cached_font *add_cached_font( DC *dc, HFONT hfont, UINT aa_flags ) font.aa_flags = aa_flags; font.hash = font_cache_hash( &font );
- pthread_mutex_lock( &font_cache_lock ); + WINE_MUTEX_LOCK( &font_cache_lock ); LIST_FOR_EACH_ENTRY( ptr, &font_cache, struct cached_font, entry ) { if (!font_cache_cmp( &font, ptr )) @@ -602,7 +603,7 @@ static struct cached_font *add_cached_font( DC *dc, HFONT hfont, UINT aa_flags ) } else if (!(ptr = malloc( sizeof(*ptr) ))) { - pthread_mutex_unlock( &font_cache_lock ); + WINE_MUTEX_UNLOCK( &font_cache_lock ); return NULL; }
@@ -611,7 +612,7 @@ static struct cached_font *add_cached_font( DC *dc, HFONT hfont, UINT aa_flags ) memset( ptr->glyphs, 0, sizeof(ptr->glyphs) ); done: list_add_head( &font_cache, &ptr->entry ); - pthread_mutex_unlock( &font_cache_lock ); + WINE_MUTEX_UNLOCK( &font_cache_lock ); TRACE( "%d %s -> %p\n", (int)ptr->lf.lfHeight, debugstr_w(ptr->lf.lfFaceName), ptr ); return ptr; } diff --git a/dlls/win32u/font.c b/dlls/win32u/font.c index 8fb3128f5e0..c3c4008c037 100644 --- a/dlls/win32u/font.c +++ b/dlls/win32u/font.c @@ -43,6 +43,7 @@
#include "wine/unixlib.h" #include "wine/rbtree.h" +#include "wine/mutex.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(font); @@ -460,7 +461,7 @@ static const struct nls_update_font_list } };
-static pthread_mutex_t font_lock = PTHREAD_MUTEX_INITIALIZER; +static WINE_MUTEX_TYPE font_lock = WINE_MUTEX_INIT;
#ifdef WORDS_BIGENDIAN #define GET_BE_WORD(x) (x) @@ -1059,7 +1060,7 @@ static int remove_font( const WCHAR *file, DWORD flags ) struct gdi_font_face *face, *face_next; int count = 0;
- pthread_mutex_lock( &font_lock ); + WINE_MUTEX_LOCK( &font_lock ); WINE_RB_FOR_EACH_ENTRY_DESTRUCTOR( family, family_next, &family_name_tree, struct gdi_font_family, name_entry ) { family->refcount++; @@ -1076,7 +1077,7 @@ static int remove_font( const WCHAR *file, DWORD flags ) } release_family( family ); } - pthread_mutex_unlock( &font_lock ); + WINE_MUTEX_UNLOCK( &font_lock ); return count; }
@@ -2962,7 +2963,7 @@ static void release_gdi_font( struct gdi_font *font ) TRACE( "font %p\n", font );
/* add it to the unused list */ - pthread_mutex_lock( &font_lock ); + WINE_MUTEX_LOCK( &font_lock ); if (!--font->refcount) { list_add_head( &unused_gdi_font_list, &font->unused_entry ); @@ -2976,7 +2977,7 @@ static void release_gdi_font( struct gdi_font *font ) } else unused_font_count++; } - pthread_mutex_unlock( &font_lock ); + WINE_MUTEX_UNLOCK( &font_lock ); }
static void add_font_list(HKEY hkey, const struct nls_update_font_list *fl, int dpi) @@ -3508,9 +3509,9 @@ static BOOL enum_face_charsets( const struct gdi_font_family *family, struct gdi elf.elfLogFont.lfCharSet, type, debugstr_w(elf.elfScript), elf.elfLogFont.lfItalic, (int)elf.elfLogFont.lfWeight, (int)ntm.ntmTm.ntmFlags ); /* release section before callback (FIXME) */ - pthread_mutex_unlock( &font_lock ); + WINE_MUTEX_UNLOCK( &font_lock ); if (!proc( &elf.elfLogFont, (TEXTMETRICW *)&ntm, type, lparam )) return FALSE; - pthread_mutex_lock( &font_lock ); + WINE_MUTEX_LOCK( &font_lock ); } return TRUE; } @@ -3529,7 +3530,7 @@ static BOOL font_EnumFonts( PHYSDEV dev, LOGFONTW *lf, font_enum_proc proc, LPAR
count = create_enum_charset_list( charset, enum_charsets );
- pthread_mutex_lock( &font_lock ); + WINE_MUTEX_LOCK( &font_lock );
if (lf && lf->lfFaceName[0]) { @@ -3565,7 +3566,7 @@ static BOOL font_EnumFonts( PHYSDEV dev, LOGFONTW *lf, font_enum_proc proc, LPAR return FALSE; /* enum_face_charsets() unlocked font_lock */ } } - pthread_mutex_unlock( &font_lock ); + WINE_MUTEX_UNLOCK( &font_lock ); return TRUE; }
@@ -3912,13 +3913,13 @@ static BOOL font_GetCharABCWidths( PHYSDEV dev, UINT first, UINT count, WCHAR *c
TRACE( "%p, %u, %u, %p\n", physdev->font, first, count, buffer );
- pthread_mutex_lock( &font_lock ); + WINE_MUTEX_LOCK( &font_lock ); for (i = 0; i < count; i++) { c = chars ? chars[i] : first + i; get_glyph_outline( physdev->font, c, GGO_METRICS, NULL, &buffer[i], 0, NULL, NULL ); } - pthread_mutex_unlock( &font_lock ); + WINE_MUTEX_UNLOCK( &font_lock ); return TRUE; }
@@ -3939,11 +3940,11 @@ static BOOL font_GetCharABCWidthsI( PHYSDEV dev, UINT first, UINT count, WORD *g
TRACE( "%p, %u, %u, %p\n", physdev->font, first, count, buffer );
- pthread_mutex_lock( &font_lock ); + WINE_MUTEX_LOCK( &font_lock ); for (c = 0; c < count; c++, buffer++) get_glyph_outline( physdev->font, gi ? gi[c] : first + c, GGO_METRICS | GGO_GLYPH_INDEX, NULL, buffer, 0, NULL, NULL ); - pthread_mutex_unlock( &font_lock ); + WINE_MUTEX_UNLOCK( &font_lock ); return TRUE; }
@@ -3965,7 +3966,7 @@ static BOOL font_GetCharWidth( PHYSDEV dev, UINT first, UINT count, const WCHAR
TRACE( "%p, %d, %d, %p\n", physdev->font, first, count, buffer );
- pthread_mutex_lock( &font_lock ); + WINE_MUTEX_LOCK( &font_lock ); for (i = 0; i < count; i++) { c = chars ? chars[i] : i + first; @@ -3974,7 +3975,7 @@ static BOOL font_GetCharWidth( PHYSDEV dev, UINT first, UINT count, const WCHAR else buffer[i] = abc.abcA + abc.abcB + abc.abcC; } - pthread_mutex_unlock( &font_lock ); + WINE_MUTEX_UNLOCK( &font_lock ); return TRUE; }
@@ -4099,7 +4100,7 @@ static DWORD font_GetGlyphIndices( PHYSDEV dev, const WCHAR *str, INT count, WOR got_default = TRUE; }
- pthread_mutex_lock( &font_lock ); + WINE_MUTEX_LOCK( &font_lock );
for (i = 0; i < count; i++) { @@ -4128,7 +4129,7 @@ static DWORD font_GetGlyphIndices( PHYSDEV dev, const WCHAR *str, INT count, WOR else gi[i] = get_GSUB_vert_glyph( physdev->font, glyph ); }
- pthread_mutex_unlock( &font_lock ); + WINE_MUTEX_UNLOCK( &font_lock ); return count; }
@@ -4147,9 +4148,9 @@ static DWORD font_GetGlyphOutline( PHYSDEV dev, UINT glyph, UINT format, dev = GET_NEXT_PHYSDEV( dev, pGetGlyphOutline ); return dev->funcs->pGetGlyphOutline( dev, glyph, format, gm, buflen, buf, mat ); } - pthread_mutex_lock( &font_lock ); + WINE_MUTEX_LOCK( &font_lock ); ret = get_glyph_outline( physdev->font, glyph, format, gm, NULL, buflen, buf, mat ); - pthread_mutex_unlock( &font_lock ); + WINE_MUTEX_UNLOCK( &font_lock ); return ret; }
@@ -4167,11 +4168,11 @@ static DWORD font_GetKerningPairs( PHYSDEV dev, DWORD count, KERNINGPAIR *pairs return dev->funcs->pGetKerningPairs( dev, count, pairs ); }
- pthread_mutex_lock( &font_lock ); + WINE_MUTEX_LOCK( &font_lock ); if (physdev->font->kern_count == -1) physdev->font->kern_count = font_funcs->get_kerning_pairs( physdev->font, &physdev->font->kern_pairs ); - pthread_mutex_unlock( &font_lock ); + WINE_MUTEX_UNLOCK( &font_lock );
if (count && pairs) { @@ -4264,7 +4265,7 @@ static UINT font_GetOutlineTextMetrics( PHYSDEV dev, UINT size, OUTLINETEXTMETRI
if (!physdev->font->scalable) return 0;
- pthread_mutex_lock( &font_lock ); + WINE_MUTEX_LOCK( &font_lock ); if (font_funcs->set_outline_text_metrics( physdev->font )) { ret = physdev->font->otm.otmSize; @@ -4286,7 +4287,7 @@ static UINT font_GetOutlineTextMetrics( PHYSDEV dev, UINT size, OUTLINETEXTMETRI scale_outline_font_metrics( physdev->font, metrics ); } } - pthread_mutex_unlock( &font_lock ); + WINE_MUTEX_UNLOCK( &font_lock ); return ret; }
@@ -4325,14 +4326,14 @@ static BOOL font_GetTextExtentExPoint( PHYSDEV dev, const WCHAR *str, INT count,
TRACE( "%p, %s, %d\n", physdev->font, debugstr_wn(str, count), count );
- pthread_mutex_lock( &font_lock ); + WINE_MUTEX_LOCK( &font_lock ); for (i = pos = 0; i < count; i++) { get_glyph_outline( physdev->font, str[i], GGO_METRICS, NULL, &abc, 0, NULL, NULL ); pos += abc.abcA + abc.abcB + abc.abcC; dxs[i] = pos; } - pthread_mutex_unlock( &font_lock ); + WINE_MUTEX_UNLOCK( &font_lock ); return TRUE; }
@@ -4354,7 +4355,7 @@ static BOOL font_GetTextExtentExPointI( PHYSDEV dev, const WORD *indices, INT co
TRACE( "%p, %p, %d\n", physdev->font, indices, count );
- pthread_mutex_lock( &font_lock ); + WINE_MUTEX_LOCK( &font_lock ); for (i = pos = 0; i < count; i++) { get_glyph_outline( physdev->font, indices[i], GGO_METRICS | GGO_GLYPH_INDEX, @@ -4362,7 +4363,7 @@ static BOOL font_GetTextExtentExPointI( PHYSDEV dev, const WORD *indices, INT co pos += abc.abcA + abc.abcB + abc.abcC; dxs[i] = pos; } - pthread_mutex_unlock( &font_lock ); + WINE_MUTEX_UNLOCK( &font_lock ); return TRUE; }
@@ -4451,7 +4452,7 @@ static BOOL font_GetTextMetrics( PHYSDEV dev, TEXTMETRICW *metrics ) return dev->funcs->pGetTextMetrics( dev, metrics ); }
- pthread_mutex_lock( &font_lock ); + WINE_MUTEX_LOCK( &font_lock ); if (font_funcs->set_outline_text_metrics( physdev->font ) || font_funcs->set_bitmap_text_metrics( physdev->font )) { @@ -4459,7 +4460,7 @@ static BOOL font_GetTextMetrics( PHYSDEV dev, TEXTMETRICW *metrics ) scale_font_metrics( physdev->font, metrics ); ret = TRUE; } - pthread_mutex_unlock( &font_lock ); + WINE_MUTEX_UNLOCK( &font_lock ); return ret; }
@@ -4657,7 +4658,7 @@ static HFONT font_SelectFont( PHYSDEV dev, HFONT hfont, UINT *aa_flags ) } TRACE( "DC transform %f %f %f %f\n", dcmat.eM11, dcmat.eM12, dcmat.eM21, dcmat.eM22 );
- pthread_mutex_lock( &font_lock ); + WINE_MUTEX_LOCK( &font_lock );
font = select_font( &lf, dcmat, can_use_bitmap );
@@ -4674,7 +4675,7 @@ static HFONT font_SelectFont( PHYSDEV dev, HFONT hfont, UINT *aa_flags ) *aa_flags = font_funcs->get_aa_flags( font, *aa_flags, antialias_fakes ); } TRACE( "%p %s %d aa %x\n", hfont, debugstr_w(lf.lfFaceName), (int)lf.lfHeight, *aa_flags ); - pthread_mutex_unlock( &font_lock ); + WINE_MUTEX_UNLOCK( &font_lock ); } physdev->font = font; if (prev) release_gdi_font( prev ); @@ -6433,16 +6434,16 @@ static int add_system_font_resource( const WCHAR *file, DWORD flags )
/* try in %WINDIR%/fonts, needed for Fotobuch Designer */ get_fonts_win_dir_path( file, path ); - pthread_mutex_lock( &font_lock ); + WINE_MUTEX_LOCK( &font_lock ); ret = font_funcs->add_font( path, flags ); - pthread_mutex_unlock( &font_lock ); + WINE_MUTEX_UNLOCK( &font_lock ); /* try in datadir/fonts (or builddir/fonts), needed for Magic the Gathering Online */ if (!ret) { get_fonts_data_dir_path( file, path ); - pthread_mutex_lock( &font_lock ); + WINE_MUTEX_LOCK( &font_lock ); ret = font_funcs->add_font( path, flags ); - pthread_mutex_unlock( &font_lock ); + WINE_MUTEX_UNLOCK( &font_lock ); } return ret; } @@ -6470,9 +6471,9 @@ static int add_font_resource( LPCWSTR file, DWORD flags ) DWORD addfont_flags = ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE;
if (!(flags & FR_PRIVATE)) addfont_flags |= ADDFONT_ADD_TO_CACHE; - pthread_mutex_lock( &font_lock ); + WINE_MUTEX_LOCK( &font_lock ); ret = font_funcs->add_font( file, addfont_flags ); - pthread_mutex_unlock( &font_lock ); + WINE_MUTEX_UNLOCK( &font_lock ); } else if (!wcschr( file, '\' )) ret = add_system_font_resource( file, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE ); @@ -6859,9 +6860,9 @@ HANDLE WINAPI NtGdiAddFontMemResourceEx( void *ptr, DWORD size, void *dv, ULONG if (!(copy = malloc( size ))) return NULL; memcpy( copy, ptr, size );
- pthread_mutex_lock( &font_lock ); + WINE_MUTEX_LOCK( &font_lock ); num_fonts = font_funcs->add_mem_font( copy, size, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE ); - pthread_mutex_unlock( &font_lock ); + WINE_MUTEX_UNLOCK( &font_lock );
if (!num_fonts) { @@ -6999,7 +7000,7 @@ BOOL WINAPI NtGdiGetFontFileData( DWORD instance_id, DWORD file_index, UINT64 *o BOOL ret = FALSE;
if (!font_funcs) return FALSE; - pthread_mutex_lock( &font_lock ); + WINE_MUTEX_LOCK( &font_lock ); if ((font = get_font_from_handle( instance_id ))) { if (font->ttc_item_offset) tag = MS_TTCF_TAG; @@ -7009,7 +7010,7 @@ BOOL WINAPI NtGdiGetFontFileData( DWORD instance_id, DWORD file_index, UINT64 *o else RtlSetLastWin32Error( ERROR_INVALID_PARAMETER ); } - pthread_mutex_unlock( &font_lock ); + WINE_MUTEX_UNLOCK( &font_lock ); return ret; }
@@ -7023,7 +7024,7 @@ BOOL WINAPI NtGdiGetFontFileInfo( DWORD instance_id, DWORD file_index, struct fo struct gdi_font *font; BOOL ret = FALSE;
- pthread_mutex_lock( &font_lock ); + WINE_MUTEX_LOCK( &font_lock );
if ((font = get_font_from_handle( instance_id ))) { @@ -7038,7 +7039,7 @@ BOOL WINAPI NtGdiGetFontFileInfo( DWORD instance_id, DWORD file_index, struct fo else RtlSetLastWin32Error( ERROR_INSUFFICIENT_BUFFER ); }
- pthread_mutex_unlock( &font_lock ); + WINE_MUTEX_UNLOCK( &font_lock ); if (needed) *needed = required_size; return ret; } diff --git a/dlls/win32u/gdiobj.c b/dlls/win32u/gdiobj.c index 5cf99e39ff0..a2745382663 100644 --- a/dlls/win32u/gdiobj.c +++ b/dlls/win32u/gdiobj.c @@ -38,6 +38,7 @@
#include "ntgdi_private.h" #include "wine/debug.h" +#include "wine/mutex.h" #include "wine/unixlib.h"
WINE_DEFAULT_DEBUG_CHANNEL(gdi); @@ -88,7 +89,7 @@ static const LOGBRUSH DkGrayBrush = { BS_SOLID, RGB(64,64,64), 0 };
static const LOGBRUSH DCBrush = { BS_SOLID, RGB(255,255,255), 0 };
-static pthread_mutex_t gdi_lock; +static WINE_MUTEX_RECURSIVE_TYPE gdi_lock;
/**************************************************************************** @@ -454,9 +455,9 @@ void make_gdi_object_system( HGDIOBJ handle, BOOL set) { GDI_HANDLE_ENTRY *entry;
- pthread_mutex_lock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_LOCK( &gdi_lock ); if ((entry = handle_entry( handle ))) entry_obj( entry )->system = !!set; - pthread_mutex_unlock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_UNLOCK( &gdi_lock ); }
/****************************************************************************** @@ -492,9 +493,9 @@ UINT GDI_get_ref_count( HGDIOBJ handle ) GDI_HANDLE_ENTRY *entry; UINT ret = 0;
- pthread_mutex_lock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_LOCK( &gdi_lock ); if ((entry = handle_entry( handle ))) ret = entry_obj( entry )->selcount; - pthread_mutex_unlock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_UNLOCK( &gdi_lock ); return ret; }
@@ -508,10 +509,10 @@ HGDIOBJ GDI_inc_ref_count( HGDIOBJ handle ) { GDI_HANDLE_ENTRY *entry;
- pthread_mutex_lock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_LOCK( &gdi_lock ); if ((entry = handle_entry( handle ))) entry_obj( entry )->selcount++; else handle = 0; - pthread_mutex_unlock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_UNLOCK( &gdi_lock ); return handle; }
@@ -525,7 +526,7 @@ BOOL GDI_dec_ref_count( HGDIOBJ handle ) { GDI_HANDLE_ENTRY *entry;
- pthread_mutex_lock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_LOCK( &gdi_lock ); if ((entry = handle_entry( handle ))) { assert( entry_obj( entry )->selcount ); @@ -533,13 +534,13 @@ BOOL GDI_dec_ref_count( HGDIOBJ handle ) { /* handle delayed DeleteObject*/ entry_obj( entry )->deleted = 0; - pthread_mutex_unlock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_UNLOCK( &gdi_lock ); TRACE( "executing delayed DeleteObject for %p\n", handle ); NtGdiDeleteObjectApp( handle ); return TRUE; } } - pthread_mutex_unlock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_UNLOCK( &gdi_lock ); return entry != NULL; }
@@ -696,7 +697,7 @@ static void dump_gdi_objects( void )
TRACE( "%u objects:\n", GDI_MAX_HANDLE_COUNT );
- pthread_mutex_lock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_LOCK( &gdi_lock ); for (entry = gdi_shared->Handles; entry < next_unused; entry++) { if (!entry->Type) @@ -707,7 +708,7 @@ static void dump_gdi_objects( void ) gdi_obj_type( entry->ExtType << NTGDI_HANDLE_TYPE_SHIFT ), entry_obj( entry )->selcount, entry_obj( entry )->deleted ); } - pthread_mutex_unlock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_UNLOCK( &gdi_lock ); }
/*********************************************************************** @@ -722,7 +723,7 @@ HGDIOBJ alloc_gdi_handle( struct gdi_obj_header *obj, DWORD type, const struct g
assert( type ); /* type 0 is reserved to mark free entries */
- pthread_mutex_lock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_LOCK( &gdi_lock );
entry = next_free; if (entry) @@ -731,7 +732,7 @@ HGDIOBJ alloc_gdi_handle( struct gdi_obj_header *obj, DWORD type, const struct g entry = next_unused++; else { - pthread_mutex_unlock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_UNLOCK( &gdi_lock ); ERR( "out of GDI object handles, expect a crash\n" ); if (TRACE_ON(gdi)) dump_gdi_objects(); return 0; @@ -745,7 +746,7 @@ HGDIOBJ alloc_gdi_handle( struct gdi_obj_header *obj, DWORD type, const struct g entry->Type = entry->ExtType & 0x1f; if (++entry->Generation == 0x80) entry->Generation = 1; ret = entry_to_handle( entry ); - pthread_mutex_unlock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_UNLOCK( &gdi_lock ); TRACE( "allocated %s %p %u/%u\n", gdi_obj_type(type), ret, (int)InterlockedIncrement( &debug_count ), GDI_MAX_HANDLE_COUNT ); return ret; @@ -762,7 +763,7 @@ void *free_gdi_handle( HGDIOBJ handle ) void *object = NULL; GDI_HANDLE_ENTRY *entry;
- pthread_mutex_lock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_LOCK( &gdi_lock ); if ((entry = handle_entry( handle ))) { TRACE( "freed %s %p %u/%u\n", gdi_obj_type( entry->ExtType << NTGDI_HANDLE_TYPE_SHIFT ), @@ -772,7 +773,7 @@ void *free_gdi_handle( HGDIOBJ handle ) entry->Object = (UINT_PTR)next_free; next_free = entry; } - pthread_mutex_unlock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_UNLOCK( &gdi_lock ); return object; }
@@ -800,7 +801,7 @@ void *get_any_obj_ptr( HGDIOBJ handle, DWORD *type ) void *ptr = NULL; GDI_HANDLE_ENTRY *entry;
- pthread_mutex_lock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_LOCK( &gdi_lock );
if ((entry = handle_entry( handle ))) { @@ -808,7 +809,7 @@ void *get_any_obj_ptr( HGDIOBJ handle, DWORD *type ) *type = entry->ExtType << NTGDI_HANDLE_TYPE_SHIFT; }
- if (!ptr) pthread_mutex_unlock( &gdi_lock ); + if (!ptr) WINE_MUTEX_RECURSIVE_UNLOCK( &gdi_lock ); return ptr; }
@@ -837,7 +838,7 @@ void *GDI_GetObjPtr( HGDIOBJ handle, DWORD type ) */ void GDI_ReleaseObj( HGDIOBJ handle ) { - pthread_mutex_unlock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_UNLOCK( &gdi_lock ); }
@@ -861,10 +862,10 @@ BOOL WINAPI NtGdiDeleteObjectApp( HGDIOBJ obj ) const struct gdi_obj_funcs *funcs = NULL; struct gdi_obj_header *header;
- pthread_mutex_lock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_LOCK( &gdi_lock ); if (!(entry = handle_entry( obj ))) { - pthread_mutex_unlock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_UNLOCK( &gdi_lock ); return FALSE; }
@@ -872,7 +873,7 @@ BOOL WINAPI NtGdiDeleteObjectApp( HGDIOBJ obj ) if (header->system) { TRACE("Preserving system object %p\n", obj); - pthread_mutex_unlock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_UNLOCK( &gdi_lock ); return TRUE; }
@@ -885,7 +886,7 @@ BOOL WINAPI NtGdiDeleteObjectApp( HGDIOBJ obj ) } else funcs = header->funcs;
- pthread_mutex_unlock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_UNLOCK( &gdi_lock );
TRACE("%p\n", obj );
@@ -932,13 +933,13 @@ INT WINAPI NtGdiExtGetObjectW( HGDIOBJ handle, INT count, void *buffer )
TRACE("%p %d %p\n", handle, count, buffer );
- pthread_mutex_lock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_LOCK( &gdi_lock ); if ((entry = handle_entry( handle ))) { funcs = entry_obj( entry )->funcs; handle = entry_to_handle( entry ); /* make it a full handle */ } - pthread_mutex_unlock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_UNLOCK( &gdi_lock );
if (funcs && funcs->pGetObjectW) { @@ -987,13 +988,13 @@ BOOL WINAPI NtGdiUnrealizeObject( HGDIOBJ obj ) const struct gdi_obj_funcs *funcs = NULL; GDI_HANDLE_ENTRY *entry;
- pthread_mutex_lock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_LOCK( &gdi_lock ); if ((entry = handle_entry( obj ))) { funcs = entry_obj( entry )->funcs; obj = entry_to_handle( entry ); /* make it a full handle */ } - pthread_mutex_unlock( &gdi_lock ); + WINE_MUTEX_RECURSIVE_UNLOCK( &gdi_lock );
if (funcs && funcs->pUnrealizeObject) return funcs->pUnrealizeObject( obj ); return funcs != NULL; @@ -1029,13 +1030,9 @@ BOOL WINAPI NtGdiSetColorAdjustment( HDC hdc, const COLORADJUSTMENT *ca )
void gdi_init(void) { - pthread_mutexattr_t attr; unsigned int dpi;
- pthread_mutexattr_init( &attr ); - pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_RECURSIVE ); - pthread_mutex_init( &gdi_lock, &attr ); - pthread_mutexattr_destroy( &attr ); + WINE_MUTEX_RECURSIVE_INIT(&gdi_lock);
NtQuerySystemInformation( SystemBasicInformation, &system_info, sizeof(system_info), NULL ); init_gdi_shared(); diff --git a/dlls/win32u/imm.c b/dlls/win32u/imm.c index 4a9aca22360..a429194d3aa 100644 --- a/dlls/win32u/imm.c +++ b/dlls/win32u/imm.c @@ -30,6 +30,7 @@ #include "win32u_private.h" #include "ntuser_private.h" #include "immdev.h" +#include "wine/mutex.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(imm); @@ -65,7 +66,7 @@ struct imm_thread_data };
static struct list thread_data_list = LIST_INIT( thread_data_list ); -static pthread_mutex_t imm_mutex = PTHREAD_MUTEX_INITIALIZER; +static WINE_MUTEX_TYPE imm_mutex = WINE_MUTEX_INIT; static struct list ime_updates = LIST_INIT( ime_updates ); static BOOL disable_ime;
@@ -266,9 +267,9 @@ static struct imm_thread_data *get_imm_thread_data(void) if (!(data = calloc( 1, sizeof( *data )))) return NULL; data->thread_id = GetCurrentThreadId();
- pthread_mutex_lock( &imm_mutex ); + WINE_MUTEX_LOCK( &imm_mutex ); list_add_tail( &thread_data_list, &data->entry ); - pthread_mutex_unlock( &imm_mutex ); + WINE_MUTEX_UNLOCK( &imm_mutex );
thread_info->imm_thread_data = data; } @@ -339,7 +340,7 @@ BOOL WINAPI NtUserDisableThreadIme( DWORD thread_id ) { disable_ime = TRUE;
- pthread_mutex_lock( &imm_mutex ); + WINE_MUTEX_LOCK( &imm_mutex ); LIST_FOR_EACH_ENTRY( thread_data, &thread_data_list, struct imm_thread_data, entry ) { if (thread_data->thread_id == GetCurrentThreadId()) continue; @@ -347,7 +348,7 @@ BOOL WINAPI NtUserDisableThreadIme( DWORD thread_id ) NtUserMessageCall( thread_data->default_hwnd, WM_WINE_DESTROYWINDOW, 0, 0, 0, NtUserSendNotifyMessage, FALSE ); } - pthread_mutex_unlock( &imm_mutex ); + WINE_MUTEX_UNLOCK( &imm_mutex ); } else if (!thread_id || thread_id == GetCurrentThreadId()) { @@ -375,14 +376,14 @@ HWND get_default_ime_window( HWND hwnd )
if (!(thread_id = get_window_thread( hwnd, NULL ))) return 0;
- pthread_mutex_lock( &imm_mutex ); + WINE_MUTEX_LOCK( &imm_mutex ); LIST_FOR_EACH_ENTRY( thread_data, &thread_data_list, struct imm_thread_data, entry ) { if (thread_data->thread_id != thread_id) continue; ret = thread_data->default_hwnd; break; } - pthread_mutex_unlock( &imm_mutex ); + WINE_MUTEX_UNLOCK( &imm_mutex ); } else if ((thread_data = get_user_thread_info()->imm_thread_data)) { @@ -399,9 +400,9 @@ void cleanup_imm_thread(void)
if (thread_info->imm_thread_data) { - pthread_mutex_lock( &imm_mutex ); + WINE_MUTEX_LOCK( &imm_mutex ); list_remove( &thread_info->imm_thread_data->entry ); - pthread_mutex_unlock( &imm_mutex ); + WINE_MUTEX_UNLOCK( &imm_mutex ); free( thread_info->imm_thread_data ); thread_info->imm_thread_data = NULL; } @@ -456,11 +457,11 @@ static void post_ime_update( HWND hwnd, UINT cursor_pos, WCHAR *comp_str, WCHAR
if (!(update->vkey = data->ime_process_vkey)) { - pthread_mutex_lock( &imm_mutex ); + WINE_MUTEX_LOCK( &imm_mutex ); id = update->scan = ++ime_update_count; update->vkey = VK_PROCESSKEY; list_add_tail( &ime_updates, &update->entry ); - pthread_mutex_unlock( &imm_mutex ); + WINE_MUTEX_UNLOCK( &imm_mutex );
NtUserPostMessage( hwnd, WM_IME_NOTIFY, IMN_WINE_SET_COMP_STRING, id ); } @@ -490,11 +491,11 @@ UINT ime_to_tascii_ex( UINT vkey, UINT lparam, const BYTE *state, COMPOSITIONSTR
TRACE( "vkey %#x, lparam %#x, state %p, compstr %p, himc %p\n", vkey, lparam, state, compstr, himc );
- pthread_mutex_lock( &imm_mutex ); + WINE_MUTEX_LOCK( &imm_mutex );
if (!(update = find_ime_update( vkey, lparam ))) { - pthread_mutex_unlock( &imm_mutex ); + WINE_MUTEX_UNLOCK( &imm_mutex ); return STATUS_NOT_FOUND; }
@@ -518,12 +519,12 @@ UINT ime_to_tascii_ex( UINT vkey, UINT lparam, const BYTE *state, COMPOSITIONSTR if (compstr->dwSize < needed) { compstr->dwSize = needed; - pthread_mutex_unlock( &imm_mutex ); + WINE_MUTEX_UNLOCK( &imm_mutex ); return STATUS_BUFFER_TOO_SMALL; }
list_remove( &update->entry ); - pthread_mutex_unlock( &imm_mutex ); + WINE_MUTEX_UNLOCK( &imm_mutex );
memset( compstr, 0, sizeof(*compstr) ); compstr->dwSize = sizeof(*compstr); @@ -590,9 +591,9 @@ LRESULT ime_driver_call( HWND hwnd, enum wine_ime_call call, WPARAM wparam, LPAR
if (data->update) { - pthread_mutex_lock( &imm_mutex ); + WINE_MUTEX_LOCK( &imm_mutex ); list_add_tail( &ime_updates, &data->update->entry ); - pthread_mutex_unlock( &imm_mutex ); + WINE_MUTEX_UNLOCK( &imm_mutex ); data->update = NULL; res = TRUE; } diff --git a/dlls/win32u/rawinput.c b/dlls/win32u/rawinput.c index 62b1707dbfe..f47937a7449 100644 --- a/dlls/win32u/rawinput.c +++ b/dlls/win32u/rawinput.c @@ -33,6 +33,7 @@ #include "ddk/hidclass.h" #include "wine/hid.h" #include "wine/server.h" +#include "wine/mutex.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(rawinput); @@ -65,7 +66,7 @@ struct device static RAWINPUTDEVICE *registered_devices; static unsigned int registered_device_count; static struct list devices = LIST_INIT( devices ); -static pthread_mutex_t rawinput_mutex = PTHREAD_MUTEX_INITIALIZER; +static WINE_MUTEX_TYPE rawinput_mutex = WINE_MUTEX_INIT;
static struct device *add_device( HKEY key, DWORD type ) { @@ -344,7 +345,7 @@ UINT WINAPI NtUserGetRawInputDeviceList( RAWINPUTDEVICELIST *device_list, UINT * return ~0u; }
- pthread_mutex_lock( &rawinput_mutex ); + WINE_MUTEX_LOCK( &rawinput_mutex );
rawinput_update_device_list( FALSE );
@@ -356,7 +357,7 @@ UINT WINAPI NtUserGetRawInputDeviceList( RAWINPUTDEVICELIST *device_list, UINT * device_list++; }
- pthread_mutex_unlock( &rawinput_mutex ); + WINE_MUTEX_UNLOCK( &rawinput_mutex );
if (!device_list) { @@ -398,11 +399,11 @@ UINT WINAPI NtUserGetRawInputDeviceInfo( HANDLE handle, UINT command, void *data return ~0u; }
- pthread_mutex_lock( &rawinput_mutex ); + WINE_MUTEX_LOCK( &rawinput_mutex );
if (!(device = find_device_from_handle( handle, TRUE ))) { - pthread_mutex_unlock( &rawinput_mutex ); + WINE_MUTEX_UNLOCK( &rawinput_mutex ); RtlSetLastWin32Error( ERROR_INVALID_HANDLE ); return ~0u; } @@ -435,7 +436,7 @@ UINT WINAPI NtUserGetRawInputDeviceInfo( HANDLE handle, UINT command, void *data break; }
- pthread_mutex_unlock( &rawinput_mutex ); + WINE_MUTEX_UNLOCK( &rawinput_mutex );
if (!data) return 0; @@ -575,7 +576,7 @@ BOOL process_rawinput_message( MSG *msg, UINT hw_id, const struct hardware_msg_d BOOL refresh = msg->wParam == GIDC_ARRIVAL; struct device *device;
- pthread_mutex_lock( &rawinput_mutex ); + WINE_MUTEX_LOCK( &rawinput_mutex ); if ((device = find_device_from_handle( UlongToHandle( msg_data->rawinput.device ), refresh ))) { if (msg->wParam == GIDC_REMOVAL) @@ -586,7 +587,7 @@ BOOL process_rawinput_message( MSG *msg, UINT hw_id, const struct hardware_msg_d free( device ); } } - pthread_mutex_unlock( &rawinput_mutex ); + WINE_MUTEX_UNLOCK( &rawinput_mutex ); } else { @@ -696,18 +697,18 @@ BOOL WINAPI NtUserRegisterRawInputDevices( const RAWINPUTDEVICE *devices, UINT d FIXME( "Unhandled flags %#x for device %u.\n", (int)devices[i].dwFlags, i ); }
- pthread_mutex_lock( &rawinput_mutex ); + WINE_MUTEX_LOCK( &rawinput_mutex );
if (!registered_device_count && !device_count) { - pthread_mutex_unlock( &rawinput_mutex ); + WINE_MUTEX_UNLOCK( &rawinput_mutex ); return TRUE; }
size = (SIZE_T)device_size * (registered_device_count + device_count); if (!(new_registered_devices = realloc( registered_devices, size ))) { - pthread_mutex_unlock( &rawinput_mutex ); + WINE_MUTEX_UNLOCK( &rawinput_mutex ); RtlSetLastWin32Error( ERROR_OUTOFMEMORY ); return FALSE; } @@ -720,7 +721,7 @@ BOOL WINAPI NtUserRegisterRawInputDevices( const RAWINPUTDEVICE *devices, UINT d if (!(device_count = registered_device_count)) server_devices = NULL; else if (!(server_devices = malloc( device_count * sizeof(*server_devices) ))) { - pthread_mutex_unlock( &rawinput_mutex ); + WINE_MUTEX_UNLOCK( &rawinput_mutex ); RtlSetLastWin32Error( ERROR_OUTOFMEMORY ); return FALSE; } @@ -741,7 +742,7 @@ BOOL WINAPI NtUserRegisterRawInputDevices( const RAWINPUTDEVICE *devices, UINT d
free( server_devices );
- pthread_mutex_unlock( &rawinput_mutex ); + WINE_MUTEX_UNLOCK( &rawinput_mutex );
return ret; } @@ -761,14 +762,14 @@ UINT WINAPI NtUserGetRegisteredRawInputDevices( RAWINPUTDEVICE *devices, UINT *d return ~0u; }
- pthread_mutex_lock( &rawinput_mutex ); + WINE_MUTEX_LOCK( &rawinput_mutex );
capacity = *device_count * device_size; *device_count = registered_device_count; size = (SIZE_T)device_size * *device_count; if (devices && capacity >= size) memcpy( devices, registered_devices, size );
- pthread_mutex_unlock( &rawinput_mutex ); + WINE_MUTEX_UNLOCK( &rawinput_mutex );
if (!devices) return 0;
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 9a06db2c7f6..b92c2de3f9f 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -34,6 +34,7 @@ #include "winreg.h" #include "cfgmgr32.h" #include "d3dkmdt.h" +#include "wine/mutex.h" #include "wine/wingdi16.h" #include "wine/server.h"
@@ -145,7 +146,7 @@ static struct list gpus = LIST_INIT(gpus); static struct list sources = LIST_INIT(sources); static struct list monitors = LIST_INIT(monitors); static INT64 last_query_display_time; -static pthread_mutex_t display_lock = PTHREAD_MUTEX_INITIALIZER; +static WINE_MUTEX_TYPE display_lock = WINE_MUTEX_INIT;
BOOL enable_thunk_lock = FALSE;
@@ -279,21 +280,21 @@ static RECT work_area; static DWORD process_layout = ~0u;
static HDC display_dc; -static pthread_mutex_t display_dc_lock = PTHREAD_MUTEX_INITIALIZER; +static WINE_MUTEX_TYPE display_dc_lock = WINE_MUTEX_INIT;
-static pthread_mutex_t user_mutex; +static WINE_MUTEX_RECURSIVE_TYPE user_mutex; static unsigned int user_lock_thread, user_lock_rec;
void user_lock(void) { - pthread_mutex_lock( &user_mutex ); + WINE_MUTEX_RECURSIVE_LOCK( &user_mutex ); if (!user_lock_rec++) user_lock_thread = GetCurrentThreadId(); }
void user_unlock(void) { if (!--user_lock_rec) user_lock_thread = 0; - pthread_mutex_unlock( &user_mutex ); + WINE_MUTEX_RECURSIVE_UNLOCK( &user_mutex ); }
void user_check_not_lock(void) @@ -1228,7 +1229,7 @@ static void add_gpu( const char *name, const struct pci_id *pci_id, const GUID *
if (!ctx->mutex) { - pthread_mutex_lock( &display_lock ); + WINE_MUTEX_LOCK( &display_lock ); ctx->mutex = get_display_device_init_mutex(); prepare_devices(); } @@ -1530,7 +1531,7 @@ static void release_display_manager_ctx( struct device_manager_ctx *ctx ) { if (ctx->mutex) { - pthread_mutex_unlock( &display_lock ); + WINE_MUTEX_UNLOCK( &display_lock ); release_display_device_init_mutex( ctx->mutex ); ctx->mutex = 0; } @@ -1712,7 +1713,7 @@ static BOOL update_display_cache_from_registry(void)
if (key.LastWriteTime.QuadPart <= last_query_display_time) return TRUE;
- pthread_mutex_lock( &display_lock ); + WINE_MUTEX_LOCK( &display_lock ); mutex = get_display_device_init_mutex();
clear_display_devices(); @@ -1767,7 +1768,7 @@ static BOOL update_display_cache_from_registry(void)
if ((ret = !list_empty( &sources ) && !list_empty( &monitors ))) last_query_display_time = key.LastWriteTime.QuadPart; - pthread_mutex_unlock( &display_lock ); + WINE_MUTEX_UNLOCK( &display_lock ); release_display_device_init_mutex( mutex ); return ret; } @@ -2023,10 +2024,10 @@ BOOL update_display_cache( BOOL force ) if (NtUserGetObjectInformation( winstation, UOI_NAME, name, sizeof(name), NULL ) && !wcscmp( name, wine_service_station_name )) { - pthread_mutex_lock( &display_lock ); + WINE_MUTEX_LOCK( &display_lock ); clear_display_devices(); list_add_tail( &monitors, &virtual_monitor.entry ); - pthread_mutex_unlock( &display_lock ); + WINE_MUTEX_UNLOCK( &display_lock ); return TRUE; }
@@ -2061,25 +2062,25 @@ BOOL update_display_cache( BOOL force ) static BOOL lock_display_devices(void) { if (!update_display_cache( FALSE )) return FALSE; - pthread_mutex_lock( &display_lock ); + WINE_MUTEX_LOCK( &display_lock ); return TRUE; }
static void unlock_display_devices(void) { - pthread_mutex_unlock( &display_lock ); + WINE_MUTEX_UNLOCK( &display_lock ); }
static HDC get_display_dc(void) { - pthread_mutex_lock( &display_dc_lock ); + WINE_MUTEX_LOCK( &display_dc_lock ); if (!display_dc) { HDC dc;
- pthread_mutex_unlock( &display_dc_lock ); + WINE_MUTEX_UNLOCK( &display_dc_lock ); dc = NtGdiOpenDCW( NULL, NULL, NULL, 0, TRUE, NULL, NULL, NULL ); - pthread_mutex_lock( &display_dc_lock ); + WINE_MUTEX_LOCK( &display_dc_lock ); if (display_dc) NtGdiDeleteObjectApp( dc ); else @@ -2090,7 +2091,7 @@ static HDC get_display_dc(void)
static void release_display_dc( HDC hdc ) { - pthread_mutex_unlock( &display_dc_lock ); + WINE_MUTEX_UNLOCK( &display_dc_lock ); }
/********************************************************************** @@ -4805,17 +4806,13 @@ void sysparams_init(void) WCHAR buffer[MAX_PATH+16], *p, *appname; DWORD i, dispos, dpi_scaling; WCHAR layout[KL_NAMELENGTH]; - pthread_mutexattr_t attr; HKEY hkey, appkey = 0; DWORD len;
static const WCHAR oneW[] = {'1',0}; static const WCHAR x11driverW[] = {'\','X','1','1',' ','D','r','i','v','e','r',0};
- pthread_mutexattr_init( &attr ); - pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_RECURSIVE ); - pthread_mutex_init( &user_mutex, &attr ); - pthread_mutexattr_destroy( &attr ); + WINE_MUTEX_RECURSIVE_INIT( &user_mutex );
if ((hkey = reg_create_ascii_key( hkcu_key, "Keyboard Layout\Preload", 0, NULL ))) { diff --git a/dlls/win32u/winstation.c b/dlls/win32u/winstation.c index 297a3b788ad..9a94f2136aa 100644 --- a/dlls/win32u/winstation.c +++ b/dlls/win32u/winstation.c @@ -37,6 +37,7 @@ #include "ntgdi_private.h" #include "ntuser_private.h" #include "wine/server.h" +#include "wine/mutex.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(winstation); @@ -69,7 +70,7 @@ struct session_block SIZE_T size; /* size of the mmaped data */ };
-static pthread_mutex_t session_lock = PTHREAD_MUTEX_INITIALIZER; +static WINE_MUTEX_TYPE session_lock = WINE_MUTEX_INIT; static struct list session_blocks = LIST_INIT(session_blocks);
static struct session_thread_data *get_session_thread_data(void) @@ -156,14 +157,14 @@ static NTSTATUS find_shared_session_block( SIZE_T offset, SIZE_T size, struct se
assert( offset + size > offset );
- pthread_mutex_lock( &session_lock ); + WINE_MUTEX_LOCK( &session_lock );
LIST_FOR_EACH_ENTRY( block, &session_blocks, struct session_block, entry ) { if (block->offset < offset && offset + size <= block->offset + block->size) { *ret = block; - pthread_mutex_unlock( &session_lock ); + WINE_MUTEX_UNLOCK( &session_lock ); return STATUS_SUCCESS; } } @@ -174,7 +175,7 @@ static NTSTATUS find_shared_session_block( SIZE_T offset, SIZE_T size, struct se wine_dbgstr_longlong(offset), wine_dbgstr_longlong(size), status ); }
- pthread_mutex_unlock( &session_lock ); + WINE_MUTEX_UNLOCK( &session_lock );
return status; } diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h index 774211fea15..22f221e76c3 100644 --- a/include/wine/gdi_driver.h +++ b/include/wine/gdi_driver.h @@ -38,6 +38,7 @@ #include "shellapi.h" #include "ddk/d3dkmthk.h" #include "kbd.h" +#include "wine/mutex.h" #include "wine/list.h"
struct gdi_dc_funcs; @@ -226,7 +227,7 @@ struct window_surface HWND hwnd; /* window the surface was created for */ RECT rect; /* constant, no locking needed */
- pthread_mutex_t mutex; /* mutex needed for any field below */ + WINE_MUTEX_TYPE mutex; /* mutex needed for any field below */ RECT bounds; /* dirty area rectangle */ HRGN clip_region; /* visible region of the surface, fully visible if 0 */ DWORD draw_start_ticks; /* start ticks of fresh draw */