From: Grigory Vasilyev h0tc0d3@gmail.com
--- dlls/ntdll/unix/cdrom.c | 26 +++--- dlls/ntdll/unix/file.c | 46 +++++----- dlls/ntdll/unix/server.c | 28 +++++-- dlls/ntdll/unix/signal_i386.c | 2 +- dlls/ntdll/unix/signal_x86_64.c | 2 +- dlls/ntdll/unix/system.c | 12 +-- dlls/ntdll/unix/unix_private.h | 22 +++-- dlls/ntdll/unix/virtual.c | 144 ++++++++++++++++---------------- 8 files changed, 147 insertions(+), 135 deletions(-)
diff --git a/dlls/ntdll/unix/cdrom.c b/dlls/ntdll/unix/cdrom.c index 9e651414e9a..2127e3f56e8 100644 --- a/dlls/ntdll/unix/cdrom.c +++ b/dlls/ntdll/unix/cdrom.c @@ -290,7 +290,7 @@ struct cdrom_cache { #define MAX_CACHE_ENTRIES 5 static struct cdrom_cache cdrom_cache[MAX_CACHE_ENTRIES];
-static pthread_mutex_t cache_mutex = PTHREAD_MUTEX_INITIALIZER; +static WINE_MUTEX_TYPE cache_mutex = WINE_MUTEX_INIT;
/* Proposed media change function: not really needed at this time */ /* This is a 1 or 0 type of function */ @@ -551,9 +551,9 @@ static NTSTATUS CDROM_SyncCache(int dev, int fd)
static void CDROM_ClearCacheEntry(int dev) { - mutex_lock( &cache_mutex ); + WINENTDLL_MUTEX_LOCK( &cache_mutex ); cdrom_cache[dev].toc_good = 0; - mutex_unlock( &cache_mutex ); + WINENTDLL_MUTEX_UNLOCK( &cache_mutex ); }
@@ -659,7 +659,7 @@ static NTSTATUS CDROM_Open(int fd, int* dev)
if (fstat(fd, &st) == -1) return errno_to_status( errno );
- mutex_lock( &cache_mutex ); + WINENTDLL_MUTEX_LOCK( &cache_mutex ); for (*dev = 0; *dev < MAX_CACHE_ENTRIES; (*dev)++) { if (empty == -1 && @@ -680,7 +680,7 @@ static NTSTATUS CDROM_Open(int fd, int* dev) cdrom_cache[*dev].inode = st.st_ino; } } - mutex_unlock( &cache_mutex ); + WINENTDLL_MUTEX_UNLOCK( &cache_mutex );
TRACE("%d, %d\n", *dev, fd); return ret; @@ -832,13 +832,13 @@ static NTSTATUS CDROM_ReadTOC(int dev, int fd, CDROM_TOC* toc) if (dev < 0 || dev >= MAX_CACHE_ENTRIES) return STATUS_INVALID_PARAMETER;
- mutex_lock( &cache_mutex ); + WINENTDLL_MUTEX_LOCK( &cache_mutex ); if (cdrom_cache[dev].toc_good || !(ret = CDROM_SyncCache(dev, fd))) { *toc = cdrom_cache[dev].toc; ret = STATUS_SUCCESS; } - mutex_unlock( &cache_mutex ); + WINENTDLL_MUTEX_UNLOCK( &cache_mutex ); return ret; }
@@ -918,7 +918,7 @@ static NTSTATUS CDROM_ReadQChannel(int dev, int fd, const CDROM_SUB_Q_DATA_FORMA switch (fmt->Format) { case IOCTL_CDROM_CURRENT_POSITION: - mutex_lock( &cache_mutex ); + WINENTDLL_MUTEX_LOCK( &cache_mutex ); if (hdr->AudioStatus==AUDIO_STATUS_IN_PROGRESS) { data->CurrentPosition.FormatCode = IOCTL_CDROM_CURRENT_POSITION; data->CurrentPosition.Control = sc.cdsc_ctrl; @@ -943,7 +943,7 @@ static NTSTATUS CDROM_ReadQChannel(int dev, int fd, const CDROM_SUB_Q_DATA_FORMA cdrom_cache[dev].CurrentPosition.Header = *hdr; /* Preserve header info */ data->CurrentPosition = cdrom_cache[dev].CurrentPosition; } - mutex_unlock( &cache_mutex ); + WINENTDLL_MUTEX_UNLOCK( &cache_mutex ); break; case IOCTL_CDROM_MEDIA_CATALOG: data->MediaCatalog.FormatCode = IOCTL_CDROM_MEDIA_CATALOG; @@ -1029,7 +1029,7 @@ static NTSTATUS CDROM_ReadQChannel(int dev, int fd, const CDROM_SUB_Q_DATA_FORMA switch (fmt->Format) { case IOCTL_CDROM_CURRENT_POSITION: - mutex_lock( &cache_mutex ); + WINENTDLL_MUTEX_LOCK( &cache_mutex ); if (hdr->AudioStatus==AUDIO_STATUS_IN_PROGRESS) { data->CurrentPosition.FormatCode = IOCTL_CDROM_CURRENT_POSITION; data->CurrentPosition.Control = sc.what.position.control; @@ -1051,7 +1051,7 @@ static NTSTATUS CDROM_ReadQChannel(int dev, int fd, const CDROM_SUB_Q_DATA_FORMA cdrom_cache[dev].CurrentPosition.Header = *hdr; /* Preserve header info */ data->CurrentPosition = cdrom_cache[dev].CurrentPosition; } - mutex_unlock( &cache_mutex ); + WINENTDLL_MUTEX_UNLOCK( &cache_mutex ); break; case IOCTL_CDROM_MEDIA_CATALOG: data->MediaCatalog.FormatCode = IOCTL_CDROM_MEDIA_CATALOG; @@ -1240,7 +1240,7 @@ static NTSTATUS CDROM_SeekAudioMSF(int dev, int fd, const CDROM_SEEK_AUDIO_MSF* if (i <= toc.FirstTrack || i > toc.LastTrack+1) return STATUS_INVALID_PARAMETER; i--; - mutex_lock( &cache_mutex ); + WINENTDLL_MUTEX_LOCK( &cache_mutex ); cp = &cdrom_cache[dev].CurrentPosition; cp->FormatCode = IOCTL_CDROM_CURRENT_POSITION; cp->Control = toc.TrackData[i-toc.FirstTrack].Control; @@ -1254,7 +1254,7 @@ static NTSTATUS CDROM_SeekAudioMSF(int dev, int fd, const CDROM_SEEK_AUDIO_MSF* frame -= FRAME_OF_TOC(toc,i); cp->TrackRelativeAddress[0] = 0; MSF_OF_FRAME(cp->TrackRelativeAddress[1], frame); - mutex_unlock( &cache_mutex ); + WINENTDLL_MUTEX_UNLOCK( &cache_mutex );
/* If playing, then issue a seek command, otherwise do nothing */ #ifdef linux diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c index 15fdf2cb021..afe3c4ce482 100644 --- a/dlls/ntdll/unix/file.c +++ b/dlls/ntdll/unix/file.c @@ -243,8 +243,8 @@ static mode_t start_umask; /* at some point we may want to allow Winelib apps to set this */ static const BOOL is_case_sensitive = FALSE;
-static pthread_mutex_t dir_mutex = PTHREAD_MUTEX_INITIALIZER; -static pthread_mutex_t mnt_mutex = PTHREAD_MUTEX_INITIALIZER; +static WINE_MUTEX_TYPE dir_mutex = WINE_MUTEX_INIT; +static WINE_MUTEX_TYPE mnt_mutex = WINE_MUTEX_INIT;
/* check if a given Unicode char is OK in a DOS short name */ static inline BOOL is_invalid_dos_char( WCHAR ch ) @@ -884,7 +884,7 @@ static char *get_default_drive_device( const char *root ) if (res == -1) res = stat( root, &st ); if (res == -1) return NULL;
- mutex_lock( &mnt_mutex ); + WINENTDLL_MUTEX_LOCK( &mnt_mutex );
#ifdef __ANDROID__ if ((f = fopen( "/proc/mounts", "r" ))) @@ -906,7 +906,7 @@ static char *get_default_drive_device( const char *root ) } #endif if (device) ret = strdup( device ); - mutex_unlock( &mnt_mutex ); + WINENTDLL_MUTEX_UNLOCK( &mnt_mutex );
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__ ) || defined(__DragonFly__) char *device = NULL; @@ -923,14 +923,14 @@ static char *get_default_drive_device( const char *root ) if (res == -1) res = stat( root, &st ); if (res == -1) return NULL;
- mutex_lock( &mnt_mutex ); + WINENTDLL_MUTEX_LOCK( &mnt_mutex );
/* The FreeBSD parse_mount_entries doesn't require a file argument, so just * pass NULL. Leave the argument in for symmetry. */ device = parse_mount_entries( NULL, st.st_dev, st.st_ino ); if (device) ret = strdup( device ); - mutex_unlock( &mnt_mutex ); + WINENTDLL_MUTEX_UNLOCK( &mnt_mutex );
#elif defined( sun ) FILE *f; @@ -948,7 +948,7 @@ static char *get_default_drive_device( const char *root ) if (res == -1) res = stat( root, &st ); if (res == -1) return NULL;
- mutex_lock( &mnt_mutex ); + WINENTDLL_MUTEX_LOCK( &mnt_mutex );
if ((f = fopen( "/etc/mnttab", "r" ))) { @@ -962,7 +962,7 @@ static char *get_default_drive_device( const char *root ) fclose( f ); } if (device) ret = strdup( device ); - mutex_unlock( &mnt_mutex ); + WINENTDLL_MUTEX_UNLOCK( &mnt_mutex );
#elif defined(__APPLE__) struct statfs *mntStat; @@ -980,7 +980,7 @@ static char *get_default_drive_device( const char *root ) dev = st.st_dev; ino = st.st_ino;
- mutex_lock( &mnt_mutex ); + WINENTDLL_MUTEX_LOCK( &mnt_mutex );
mntSize = getmntinfo(&mntStat, MNT_NOWAIT);
@@ -1001,7 +1001,7 @@ static char *get_default_drive_device( const char *root ) } } } - mutex_unlock( &mnt_mutex ); + WINENTDLL_MUTEX_UNLOCK( &mnt_mutex ); #else static int warned; if (!warned++) FIXME( "auto detection of DOS devices not supported on this platform\n" ); @@ -1022,7 +1022,7 @@ static char *get_device_mount_point( dev_t dev ) #ifdef linux FILE *f;
- mutex_lock( &mnt_mutex ); + WINENTDLL_MUTEX_LOCK( &mnt_mutex );
#ifdef __ANDROID__ if ((f = fopen( "/proc/mounts", "r" ))) @@ -1069,13 +1069,13 @@ static char *get_device_mount_point( dev_t dev ) } fclose( f ); } - mutex_unlock( &mnt_mutex ); + WINENTDLL_MUTEX_UNLOCK( &mnt_mutex ); #elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) struct statfs *entry; struct stat st; int i, size;
- mutex_lock( &mnt_mutex ); + WINENTDLL_MUTEX_LOCK( &mnt_mutex );
size = getmntinfo( &entry, MNT_NOWAIT ); for (i = 0; i < size; i++) @@ -1087,7 +1087,7 @@ static char *get_device_mount_point( dev_t dev ) break; } } - mutex_unlock( &mnt_mutex ); + WINENTDLL_MUTEX_UNLOCK( &mnt_mutex ); #else static int warned; if (!warned++) FIXME( "unmounting devices not supported on this platform\n" ); @@ -2169,14 +2169,14 @@ static unsigned int server_open_file_object( HANDLE *handle, ACCESS_MASK access, /* retrieve device/inode number for all the drives */ static unsigned int get_drives_info( struct file_identity info[MAX_DOS_DRIVES] ) { - static pthread_mutex_t cache_mutex = PTHREAD_MUTEX_INITIALIZER; + static WINE_MUTEX_TYPE cache_mutex = WINE_MUTEX_INIT; static struct file_identity cache[MAX_DOS_DRIVES]; static time_t last_update; static unsigned int nb_drives; unsigned int ret; time_t now = time(NULL);
- mutex_lock( &cache_mutex ); + WINENTDLL_MUTEX_LOCK( &cache_mutex ); if (now != last_update) { char *buffer, *p; @@ -2208,7 +2208,7 @@ static unsigned int get_drives_info( struct file_identity info[MAX_DOS_DRIVES] ) } memcpy( info, cache, sizeof(cache) ); ret = nb_drives; - mutex_unlock( &cache_mutex ); + WINENTDLL_MUTEX_UNLOCK( &cache_mutex ); return ret; }
@@ -2744,7 +2744,7 @@ NTSTATUS WINAPI NtQueryDirectoryFile( HANDLE handle, HANDLE event, PIO_APC_ROUTI
io->Information = 0;
- mutex_lock( &dir_mutex ); + WINENTDLL_MUTEX_LOCK( &dir_mutex );
cwd = open( ".", O_RDONLY ); if (fchdir( fd ) != -1) @@ -2771,7 +2771,7 @@ NTSTATUS WINAPI NtQueryDirectoryFile( HANDLE handle, HANDLE event, PIO_APC_ROUTI } else status = errno_to_status( errno );
- mutex_unlock( &dir_mutex ); + WINENTDLL_MUTEX_UNLOCK( &dir_mutex );
if (needs_close) close( fd ); if (cwd != -1) close( cwd ); @@ -3369,7 +3369,7 @@ static NTSTATUS file_id_to_unix_file_name( const OBJECT_ATTRIBUTES *attr, char * goto done; }
- mutex_lock( &dir_mutex ); + WINENTDLL_MUTEX_LOCK( &dir_mutex ); if ((old_cwd = open( ".", O_RDONLY )) != -1 && fchdir( root_fd ) != -1) { /* shortcut for ".." */ @@ -3390,7 +3390,7 @@ static NTSTATUS file_id_to_unix_file_name( const OBJECT_ATTRIBUTES *attr, char * if (fchdir( old_cwd ) == -1) chdir( "/" ); } else status = errno_to_status( errno ); - mutex_unlock( &dir_mutex ); + WINENTDLL_MUTEX_UNLOCK( &dir_mutex ); if (old_cwd != -1) close( old_cwd );
done: @@ -3691,14 +3691,14 @@ NTSTATUS nt_to_unix_file_name( const OBJECT_ATTRIBUTES *attr, char **name_ret, U } else { - mutex_lock( &dir_mutex ); + WINENTDLL_MUTEX_LOCK( &dir_mutex ); if ((old_cwd = open( ".", O_RDONLY )) != -1 && fchdir( root_fd ) != -1) { status = lookup_unix_name( name, name_len, &unix_name, unix_len, 1, disposition, FALSE ); if (fchdir( old_cwd ) == -1) chdir( "/" ); } else status = errno_to_status( errno ); - mutex_unlock( &dir_mutex ); + WINENTDLL_MUTEX_UNLOCK( &dir_mutex ); if (old_cwd != -1) close( old_cwd ); if (needs_close) close( root_fd ); } diff --git a/dlls/ntdll/unix/server.c b/dlls/ntdll/unix/server.c index f3ffd99c3fc..a56ffc7a1ea 100644 --- a/dlls/ntdll/unix/server.c +++ b/dlls/ntdll/unix/server.c @@ -103,7 +103,7 @@ sigset_t server_block_set; /* signals to block during server calls */ static int fd_socket = -1; /* socket to exchange file descriptors with the server */ static int initial_cwd = -1; static pid_t server_pid; -static pthread_mutex_t fd_cache_mutex = PTHREAD_MUTEX_INITIALIZER; +static WINE_MUTEX_TYPE fd_cache_mutex = WINE_MUTEX_INIT;
/* atomically exchange a 64-bit value */ static inline LONG64 interlocked_xchg64( LONG64 *dest, LONG64 val ) @@ -297,22 +297,40 @@ NTSTATUS unixcall_wine_server_call( void *args ) /*********************************************************************** * server_enter_uninterrupted_section */ -void server_enter_uninterrupted_section( pthread_mutex_t *mutex, sigset_t *sigset ) +void server_enter_uninterrupted_section( WINE_MUTEX_TYPE *mutex, sigset_t *sigset ) { pthread_sigmask( SIG_BLOCK, &server_block_set, sigset ); - mutex_lock( mutex ); + WINENTDLL_MUTEX_LOCK( mutex ); }
/*********************************************************************** * server_leave_uninterrupted_section */ -void server_leave_uninterrupted_section( pthread_mutex_t *mutex, sigset_t *sigset ) +void server_leave_uninterrupted_section( WINE_MUTEX_TYPE *mutex, sigset_t *sigset ) { - mutex_unlock( mutex ); + WINENTDLL_MUTEX_UNLOCK( mutex ); pthread_sigmask( SIG_SETMASK, sigset, NULL ); }
+/*********************************************************************** + * server_enter_uninterrupted_section_recursive + */ +void server_enter_uninterrupted_section_recursive( WINE_MUTEX_RECURSIVE_TYPE *mutex, sigset_t *sigset ) +{ + pthread_sigmask( SIG_BLOCK, &server_block_set, sigset ); + WINENTDLL_MUTEX_RECURSIVE_LOCK( mutex ); +} + + +/*********************************************************************** + * server_leave_uninterrupted_section_recursive + */ +void server_leave_uninterrupted_section_recursive( WINE_MUTEX_RECURSIVE_TYPE *mutex, sigset_t *sigset ) +{ + WINENTDLL_MUTEX_RECURSIVE_UNLOCK( mutex ); + pthread_sigmask( SIG_SETMASK, sigset, NULL ); +}
/*********************************************************************** * wait_select_reply diff --git a/dlls/ntdll/unix/signal_i386.c b/dlls/ntdll/unix/signal_i386.c index 61d41ec3589..1739d56b4c9 100644 --- a/dlls/ntdll/unix/signal_i386.c +++ b/dlls/ntdll/unix/signal_i386.c @@ -2179,7 +2179,7 @@ struct ldt_copy } __wine_ldt_copy;
static WORD gdt_fs_sel; -static pthread_mutex_t ldt_mutex = PTHREAD_MUTEX_INITIALIZER; +static WINE_MUTEX_TYPE ldt_mutex = WINE_MUTEX_INIT; static const LDT_ENTRY null_entry;
static inline void *ldt_get_base( LDT_ENTRY ent ) diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c index e84044fa805..b5cfba3a953 100644 --- a/dlls/ntdll/unix/signal_x86_64.c +++ b/dlls/ntdll/unix/signal_x86_64.c @@ -2223,7 +2223,7 @@ struct ldt_copy unsigned char flags[LDT_SIZE]; } __wine_ldt_copy;
-static pthread_mutex_t ldt_mutex = PTHREAD_MUTEX_INITIALIZER; +static WINE_MUTEX_TYPE ldt_mutex = WINE_MUTEX_INIT;
static inline void *ldt_get_base( LDT_ENTRY ent ) { diff --git a/dlls/ntdll/unix/system.c b/dlls/ntdll/unix/system.c index efb6e7f4579..7343823e68d 100644 --- a/dlls/ntdll/unix/system.c +++ b/dlls/ntdll/unix/system.c @@ -229,7 +229,7 @@ static unsigned int logical_proc_info_len, logical_proc_info_alloc_len; static SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *logical_proc_info_ex; static unsigned int logical_proc_info_ex_size, logical_proc_info_ex_alloc_size;
-static pthread_mutex_t timezone_mutex = PTHREAD_MUTEX_INITIALIZER; +static WINE_MUTEX_TYPE timezone_mutex = WINE_MUTEX_INIT;
/******************************************************************************* * Architecture specific feature detection for CPUs @@ -2403,7 +2403,7 @@ static void get_timezone_info( RTL_DYNAMIC_TIME_ZONE_INFORMATION *tzi ) time_t year_start, year_end, tmp, dlt = 0, std = 0; int is_dst, bias;
- mutex_lock( &timezone_mutex ); + WINENTDLL_MUTEX_LOCK( &timezone_mutex );
year_start = time(NULL); tm = gmtime(&year_start); @@ -2413,7 +2413,7 @@ static void get_timezone_info( RTL_DYNAMIC_TIME_ZONE_INFORMATION *tzi ) if (current_year == tm->tm_year && current_bias == bias) { *tzi = cached_tzi; - mutex_unlock( &timezone_mutex ); + WINENTDLL_MUTEX_UNLOCK( &timezone_mutex ); return; }
@@ -2506,7 +2506,7 @@ static void get_timezone_info( RTL_DYNAMIC_TIME_ZONE_INFORMATION *tzi )
find_reg_tz_info(tzi, tz_name, current_year + 1900); cached_tzi = *tzi; - mutex_unlock( &timezone_mutex ); + WINENTDLL_MUTEX_UNLOCK( &timezone_mutex ); }
@@ -2716,7 +2716,7 @@ NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS class, sti.BootTime.QuadPart = server_start_time;
utc = time( NULL ); - pthread_mutex_lock( &timezone_mutex ); + WINENTDLL_MUTEX_LOCK( &timezone_mutex ); if (utc != last_utc) { last_utc = utc; @@ -2727,7 +2727,7 @@ NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS class, last_bias *= TICKSPERSEC; } sti.TimeZoneBias.QuadPart = last_bias; - pthread_mutex_unlock( &timezone_mutex ); + WINENTDLL_MUTEX_UNLOCK( &timezone_mutex );
NtQuerySystemTime( &sti.SystemTime );
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index 6cd88a5acc0..ae599fc0c95 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -27,6 +27,7 @@ #include "wine/unixlib.h" #include "wine/server.h" #include "wine/list.h" +#include "wine/mutex.h" #include "wine/debug.h"
struct msghdr; @@ -205,8 +206,10 @@ extern ULONG_PTR redirect_arm64ec_rva( void *module, ULONG_PTR rva, const IMAGE_ extern void start_server( BOOL debug );
extern unsigned int server_call_unlocked( void *req_ptr ); -extern void server_enter_uninterrupted_section( pthread_mutex_t *mutex, sigset_t *sigset ); -extern void server_leave_uninterrupted_section( pthread_mutex_t *mutex, sigset_t *sigset ); +extern void server_enter_uninterrupted_section( WINE_MUTEX_TYPE *mutex, sigset_t *sigset ); +extern void server_leave_uninterrupted_section( WINE_MUTEX_TYPE *mutex, sigset_t *sigset ); +extern void server_enter_uninterrupted_section_recursive( WINE_MUTEX_RECURSIVE_TYPE *mutex, sigset_t *sigset ); +extern void server_leave_uninterrupted_section_recursive( WINE_MUTEX_RECURSIVE_TYPE *mutex, sigset_t *sigset ); extern unsigned int server_select( const select_op_t *select_op, data_size_t size, UINT flags, timeout_t abs_timeout, context_t *context, user_apc_t *user_apc ); extern unsigned int server_wait( const select_op_t *select_op, data_size_t size, UINT flags, @@ -415,16 +418,6 @@ static inline BOOL is_inside_signal_stack( void *ptr ) (char *)ptr < (char *)get_signal_stack() + signal_stack_size); }
-static inline void mutex_lock( pthread_mutex_t *mutex ) -{ - if (!process_exiting) pthread_mutex_lock( mutex ); -} - -static inline void mutex_unlock( pthread_mutex_t *mutex ) -{ - if (!process_exiting) pthread_mutex_unlock( mutex ); -} - static inline async_data_t server_async( HANDLE handle, struct async_fileio *user, HANDLE event, PIO_APC_ROUTINE apc, void *apc_context, client_ptr_t iosb ) { @@ -563,4 +556,9 @@ static inline NTSTATUS map_section( HANDLE mapping, void **ptr, SIZE_T *size, UL 0, NULL, size, ViewShare, 0, protect ); }
+#define WINENTDLL_MUTEX_LOCK(RESOURCE) { if (!process_exiting) WINE_MUTEX_LOCK(RESOURCE); } +#define WINENTDLL_MUTEX_UNLOCK(RESOURCE) { if (!process_exiting) WINE_MUTEX_UNLOCK(RESOURCE); } +#define WINENTDLL_MUTEX_RECURSIVE_LOCK(RESOURCE) { if (!process_exiting) WINE_MUTEX_RECURSIVE_LOCK(RESOURCE); } +#define WINENTDLL_MUTEX_RECURSIVE_UNLOCK(RESOURCE) { if (!process_exiting) WINE_MUTEX_RECURSIVE_UNLOCK(RESOURCE); } + #endif /* __NTDLL_UNIX_PRIVATE_H */ diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c index 0d88315164a..37de09b76af 100644 --- a/dlls/ntdll/unix/virtual.c +++ b/dlls/ntdll/unix/virtual.c @@ -150,7 +150,7 @@ static const BYTE VIRTUAL_Win32Flags[16] = };
static struct wine_rb_tree views_tree; -static pthread_mutex_t virtual_mutex; +static WINE_MUTEX_RECURSIVE_TYPE virtual_mutex;
static const UINT page_shift = 12; static const UINT_PTR page_mask = 0xfff; @@ -619,7 +619,7 @@ void *get_builtin_so_handle( void *module ) void *ret = NULL; struct builtin_module *builtin;
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset ); LIST_FOR_EACH_ENTRY( builtin, &builtin_modules, struct builtin_module, entry ) { if (builtin->module != module) continue; @@ -627,7 +627,7 @@ void *get_builtin_so_handle( void *module ) if (ret) builtin->refcount++; break; } - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); return ret; }
@@ -642,7 +642,7 @@ static NTSTATUS get_builtin_unix_funcs( void *module, BOOL wow, const void **fun NTSTATUS status = STATUS_DLL_NOT_FOUND; struct builtin_module *builtin;
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset ); LIST_FOR_EACH_ENTRY( builtin, &builtin_modules, struct builtin_module, entry ) { if (builtin->module != module) continue; @@ -655,7 +655,7 @@ static NTSTATUS get_builtin_unix_funcs( void *module, BOOL wow, const void **fun } break; } - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); return status; }
@@ -669,7 +669,7 @@ NTSTATUS load_builtin_unixlib( void *module, const char *name ) NTSTATUS status = STATUS_SUCCESS; struct builtin_module *builtin;
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset ); LIST_FOR_EACH_ENTRY( builtin, &builtin_modules, struct builtin_module, entry ) { if (builtin->module != module) continue; @@ -677,7 +677,7 @@ NTSTATUS load_builtin_unixlib( void *module, const char *name ) else status = STATUS_IMAGE_ALREADY_LOADED; break; } - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); return status; }
@@ -1164,12 +1164,12 @@ static void VIRTUAL_Dump(void) struct file_view *view;
TRACE( "Dump of all virtual memory views:\n" ); - server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset ); WINE_RB_FOR_EACH_ENTRY( view, &views_tree, struct file_view, entry ) { dump_view( view ); } - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); } #endif
@@ -3075,7 +3075,7 @@ static NTSTATUS virtual_map_image( HANDLE mapping, void **addr_ptr, SIZE_T *size SERVER_END_REQ; }
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset );
status = map_image_view( &view, image_info, size, limit_low, limit_high, alloc_type ); if (status) goto done; @@ -3104,7 +3104,7 @@ static NTSTATUS virtual_map_image( HANDLE mapping, void **addr_ptr, SIZE_T *size else delete_view( view );
done: - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); if (needs_close) close( unix_fd ); if (shared_needs_close) close( shared_fd ); return status; @@ -3209,7 +3209,7 @@ static unsigned int virtual_map_section( HANDLE handle, PVOID *addr_ptr, ULONG_P
if ((res = server_get_unix_fd( handle, 0, &unix_handle, &needs_close, NULL, NULL ))) return res;
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset );
res = map_view( &view, base, size, alloc_type, vprot, limit_low, limit_high, 0 ); if (res) goto done; @@ -3240,7 +3240,7 @@ static unsigned int virtual_map_section( HANDLE handle, PVOID *addr_ptr, ULONG_P else delete_view( view );
done: - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); if (needs_close) close( unix_handle ); return res; } @@ -3289,12 +3289,8 @@ void virtual_init(void) const char *preload = getenv( "WINEPRELOADRESERVE" ); size_t size; int i; - pthread_mutexattr_t attr;
- pthread_mutexattr_init( &attr ); - pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_RECURSIVE ); - pthread_mutex_init( &virtual_mutex, &attr ); - pthread_mutexattr_destroy( &attr ); + WINE_MUTEX_RECURSIVE_INIT(&virtual_mutex);
#ifdef __aarch64__ host_addr_space_limit = get_host_addr_space_limit(); @@ -3502,7 +3498,7 @@ NTSTATUS virtual_create_builtin_view( void *module, const UNICODE_STRING *nt_nam void *base = wine_server_get_ptr( info->base ); int i;
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset ); status = create_view( &view, base, size, SEC_IMAGE | SEC_FILE | VPROT_SYSTEM | VPROT_COMMITTED | VPROT_READ | VPROT_WRITECOPY | VPROT_EXEC ); if (!status) @@ -3539,7 +3535,7 @@ NTSTATUS virtual_create_builtin_view( void *module, const UNICODE_STRING *nt_nam } else delete_view( view ); } - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset );
return status; } @@ -3708,7 +3704,7 @@ NTSTATUS virtual_alloc_teb( TEB **ret_teb ) NTSTATUS status = STATUS_SUCCESS; SIZE_T block_size = signal_stack_mask + 1;
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset ); if (next_free_teb) { ptr = next_free_teb; @@ -3724,7 +3720,7 @@ NTSTATUS virtual_alloc_teb( TEB **ret_teb ) if ((status = NtAllocateVirtualMemory( NtCurrentProcess(), &ptr, user_space_wow_limit, &total, MEM_RESERVE, PAGE_READWRITE ))) { - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); return status; } teb_block = ptr; @@ -3735,14 +3731,14 @@ NTSTATUS virtual_alloc_teb( TEB **ret_teb ) MEM_COMMIT, PAGE_READWRITE ); } *ret_teb = teb = init_teb( ptr, is_wow64() ); - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset );
if ((status = signal_alloc_thread( teb ))) { - server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset ); *(void **)ptr = next_free_teb; next_free_teb = ptr; - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); } return status; } @@ -3783,13 +3779,13 @@ void virtual_free_teb( TEB *teb ) NtFreeVirtualMemory( GetCurrentProcess(), &ptr, &size, MEM_RELEASE ); }
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset ); list_remove( &thread_data->entry ); ptr = teb; if (!is_win64) ptr = (char *)ptr - teb_offset; *(void **)ptr = next_free_teb; next_free_teb = ptr; - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); }
@@ -3803,7 +3799,7 @@ NTSTATUS virtual_clear_tls_index( ULONG index )
if (index < TLS_MINIMUM_AVAILABLE) { - server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset ); LIST_FOR_EACH_ENTRY( thread_data, &teb_list, struct ntdll_thread_data, entry ) { TEB *teb = CONTAINING_RECORD( thread_data, TEB, GdiTebBatch ); @@ -3814,14 +3810,14 @@ NTSTATUS virtual_clear_tls_index( ULONG index ) #endif teb->TlsSlots[index] = 0; } - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); } else { index -= TLS_MINIMUM_AVAILABLE; if (index >= 8 * sizeof(peb->TlsExpansionBitmapBits)) return STATUS_INVALID_PARAMETER;
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset ); LIST_FOR_EACH_ENTRY( thread_data, &teb_list, struct ntdll_thread_data, entry ) { TEB *teb = CONTAINING_RECORD( thread_data, TEB, GdiTebBatch ); @@ -3836,7 +3832,7 @@ NTSTATUS virtual_clear_tls_index( ULONG index ) #endif if (teb->TlsExpansionSlots) teb->TlsExpansionSlots[index] = 0; } - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); } return STATUS_SUCCESS; } @@ -3860,7 +3856,7 @@ NTSTATUS virtual_alloc_thread_stack( INITIAL_TEB *stack, ULONG_PTR limit_low, UL if (size < 1024 * 1024) size = 1024 * 1024; /* Xlib needs a large stack */ size = (size + 0xffff) & ~0xffff; /* round to 64K boundary */
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset );
status = map_view( &view, NULL, size, 0, VPROT_READ | VPROT_WRITE | VPROT_COMMITTED, limit_low, limit_high, 0 ); @@ -3887,7 +3883,7 @@ NTSTATUS virtual_alloc_thread_stack( INITIAL_TEB *stack, ULONG_PTR limit_low, UL stack->StackBase = (char *)view->base + view->size; stack->StackLimit = (char *)view->base + (guard_page ? 2 * page_size : 0); done: - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); return status; }
@@ -3995,7 +3991,7 @@ NTSTATUS virtual_handle_fault( void *addr, DWORD err, void *stack ) char *page = ROUND_ADDR( addr, page_mask ); BYTE vprot;
- mutex_lock( &virtual_mutex ); /* no need for signal masking inside signal handler */ + WINENTDLL_MUTEX_RECURSIVE_LOCK( &virtual_mutex ); /* no need for signal masking inside signal handler */ vprot = get_page_vprot( page );
#ifdef __APPLE__ @@ -4032,7 +4028,7 @@ NTSTATUS virtual_handle_fault( void *addr, DWORD err, void *stack ) ret = STATUS_SUCCESS; } } - mutex_unlock( &virtual_mutex ); + WINENTDLL_MUTEX_RECURSIVE_UNLOCK( &virtual_mutex ); return ret; }
@@ -4070,14 +4066,14 @@ void *virtual_setup_exception( void *stack_ptr, size_t size, EXCEPTION_RECORD *r } else if (stack < stack_info.limit) { - mutex_lock( &virtual_mutex ); /* no need for signal masking inside signal handler */ + WINENTDLL_MUTEX_RECURSIVE_LOCK( &virtual_mutex ); /* no need for signal masking inside signal handler */ if ((get_page_vprot( stack ) & VPROT_GUARD) && grow_thread_stack( ROUND_ADDR( stack, page_mask ), &stack_info )) { rec->ExceptionCode = STATUS_STACK_OVERFLOW; rec->NumberParameters = 0; } - mutex_unlock( &virtual_mutex ); + WINENTDLL_MUTEX_RECURSIVE_UNLOCK( &virtual_mutex ); } #if defined(VALGRIND_MAKE_MEM_UNDEFINED) VALGRIND_MAKE_MEM_UNDEFINED( stack, size ); @@ -4126,14 +4122,14 @@ unsigned int virtual_locked_server_call( void *req_ptr )
if (!size) return wine_server_call( req_ptr );
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset ); if (!(ret = check_write_access( addr, size, &has_write_watch ))) { ret = server_call_unlocked( req ); if (has_write_watch) update_write_watches( addr, size, wine_server_reply_size( req )); } else memset( &req->u.reply, 0, sizeof(req->u.reply) ); - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); return ret; }
@@ -4150,14 +4146,14 @@ ssize_t virtual_locked_read( int fd, void *addr, size_t size ) ssize_t ret = read( fd, addr, size ); if (ret != -1 || errno != EFAULT) return ret;
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset ); if (!check_write_access( addr, size, &has_write_watch )) { ret = read( fd, addr, size ); err = errno; if (has_write_watch) update_write_watches( addr, size, max( 0, ret )); } - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); errno = err; return ret; } @@ -4175,14 +4171,14 @@ ssize_t virtual_locked_pread( int fd, void *addr, size_t size, off_t offset ) ssize_t ret = pread( fd, addr, size, offset ); if (ret != -1 || errno != EFAULT) return ret;
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset ); if (!check_write_access( addr, size, &has_write_watch )) { ret = pread( fd, addr, size, offset ); err = errno; if (has_write_watch) update_write_watches( addr, size, max( 0, ret )); } - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); errno = err; return ret; } @@ -4201,7 +4197,7 @@ ssize_t virtual_locked_recvmsg( int fd, struct msghdr *hdr, int flags ) ssize_t ret = recvmsg( fd, hdr, flags ); if (ret != -1 || errno != EFAULT) return ret;
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset ); for (i = 0; i < hdr->msg_iovlen; i++) if (check_write_access( hdr->msg_iov[i].iov_base, hdr->msg_iov[i].iov_len, &has_write_watch )) break; @@ -4213,7 +4209,7 @@ ssize_t virtual_locked_recvmsg( int fd, struct msghdr *hdr, int flags ) if (has_write_watch) while (i--) update_write_watches( hdr->msg_iov[i].iov_base, hdr->msg_iov[i].iov_len, 0 );
- server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); errno = err; return ret; } @@ -4228,10 +4224,10 @@ BOOL virtual_is_valid_code_address( const void *addr, SIZE_T size ) BOOL ret = FALSE; sigset_t sigset;
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset ); if ((view = find_view( addr, size ))) ret = !(view->protect & VPROT_SYSTEM); /* system views are not visible to the app */ - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); return ret; }
@@ -4318,7 +4314,7 @@ SIZE_T virtual_uninterrupted_read_memory( const void *addr, void *buffer, SIZE_T
if (!size) return 0;
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset ); if ((view = find_view( addr, size ))) { if (!(view->protect & VPROT_SYSTEM)) @@ -4334,7 +4330,7 @@ SIZE_T virtual_uninterrupted_read_memory( const void *addr, void *buffer, SIZE_T } } } - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); return bytes_read; }
@@ -4354,13 +4350,13 @@ NTSTATUS virtual_uninterrupted_write_memory( void *addr, const void *buffer, SIZ
if (!size) return STATUS_SUCCESS;
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset ); if (!(ret = check_write_access( addr, size, &has_write_watch ))) { memcpy( addr, buffer, size ); if (has_write_watch) update_write_watches( addr, size, size ); } - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); return ret; }
@@ -4375,7 +4371,7 @@ void virtual_set_force_exec( BOOL enable ) struct file_view *view; sigset_t sigset;
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset ); if (!force_exec_prot != !enable) /* change all existing views */ { force_exec_prot = enable; @@ -4388,7 +4384,7 @@ void virtual_set_force_exec( BOOL enable ) mprotect_range( view->base, view->size, commit, 0 ); } } - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); }
/* free reserved areas within a given range */ @@ -4520,7 +4516,7 @@ static NTSTATUS allocate_virtual_memory( void **ret, SIZE_T *size_ptr, ULONG typ
/* Reserve the memory */
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset );
if ((type & MEM_RESERVE) || !base) { @@ -4570,7 +4566,7 @@ static NTSTATUS allocate_virtual_memory( void **ret, SIZE_T *size_ptr, ULONG typ
if (!status) VIRTUAL_DEBUG_DUMP_VIEW( view );
- server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset );
if (status == STATUS_SUCCESS) { @@ -4824,7 +4820,7 @@ NTSTATUS WINAPI NtFreeVirtualMemory( HANDLE process, PVOID *addr_ptr, SIZE_T *si if (size) size = ROUND_SIZE( addr, size ); base = ROUND_ADDR( addr, page_mask );
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset );
/* avoid freeing the DOS area when a broken app passes a NULL pointer */ if (!base) @@ -4869,7 +4865,7 @@ NTSTATUS WINAPI NtFreeVirtualMemory( HANDLE process, PVOID *addr_ptr, SIZE_T *si *addr_ptr = base; *size_ptr = size; } - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); return status; }
@@ -4923,7 +4919,7 @@ NTSTATUS WINAPI NtProtectVirtualMemory( HANDLE process, PVOID *addr_ptr, SIZE_T size = ROUND_SIZE( addr, size ); base = ROUND_ADDR( addr, page_mask );
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset );
if ((view = find_view( base, size ))) { @@ -4939,7 +4935,7 @@ NTSTATUS WINAPI NtProtectVirtualMemory( HANDLE process, PVOID *addr_ptr, SIZE_T
if (!status) VIRTUAL_DEBUG_DUMP_VIEW( view );
- server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset );
if (status == STATUS_SUCCESS) { @@ -4964,7 +4960,7 @@ static unsigned int fill_basic_memory_info( const void *addr, MEMORY_BASIC_INFOR
/* Find the view containing the address */
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset ); ptr = views_tree.root; while (ptr) { @@ -5064,7 +5060,7 @@ static unsigned int fill_basic_memory_info( const void *addr, MEMORY_BASIC_INFOR else if (view->protect & (SEC_FILE | SEC_RESERVE | SEC_COMMIT)) info->Type = MEM_MAPPED; else info->Type = MEM_PRIVATE; } - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset );
return STATUS_SUCCESS; } @@ -5328,7 +5324,7 @@ static NTSTATUS get_working_set_ex( HANDLE process, LPCVOID addr, start = ref[0].addr; end = ref[count - 1].addr + page_size;
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset ); init_fill_working_set_info_data( &data, end );
view = find_view_range( start, end - start ); @@ -5359,7 +5355,7 @@ static NTSTATUS get_working_set_ex( HANDLE process, LPCVOID addr,
free_fill_working_set_info_data( &data ); if (ref != ref_buffer) free( ref ); - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset );
if (res_len) *res_len = len; @@ -5736,7 +5732,7 @@ static NTSTATUS unmap_view_of_section( HANDLE process, PVOID addr, ULONG flags ) return status; }
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset ); if (!(view = find_view( addr, 0 )) || is_view_valloc( view )) goto done;
if (flags & MEM_PRESERVE_PLACEHOLDER && !(view->protect & VPROT_PLACEHOLDER)) @@ -5755,7 +5751,7 @@ static NTSTATUS unmap_view_of_section( HANDLE process, PVOID addr, ULONG flags ) { TRACE( "not freeing in-use builtin %p\n", view->base ); builtin->refcount--; - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); return STATUS_SUCCESS; } } @@ -5775,7 +5771,7 @@ static NTSTATUS unmap_view_of_section( HANDLE process, PVOID addr, ULONG flags ) } else FIXME( "failed to unmap %p %x\n", view->base, status ); done: - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); return status; }
@@ -5927,7 +5923,7 @@ NTSTATUS WINAPI NtFlushVirtualMemory( HANDLE process, LPCVOID *addr_ptr, return result.virtual_flush.status; }
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset ); if (!(view = find_view( addr, *size_ptr ))) status = STATUS_INVALID_PARAMETER; else { @@ -5937,7 +5933,7 @@ NTSTATUS WINAPI NtFlushVirtualMemory( HANDLE process, LPCVOID *addr_ptr, if (msync( addr, *size_ptr, MS_ASYNC )) status = STATUS_NOT_MAPPED_DATA; #endif } - server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); return status; }
@@ -5964,7 +5960,7 @@ NTSTATUS WINAPI NtGetWriteWatch( HANDLE process, ULONG flags, PVOID base, SIZE_T TRACE( "%p %x %p-%p %p %lu\n", process, (int)flags, base, (char *)base + size, addresses, *count );
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset );
if (is_write_watch_range( base, size )) { @@ -5983,7 +5979,7 @@ NTSTATUS WINAPI NtGetWriteWatch( HANDLE process, ULONG flags, PVOID base, SIZE_T } else status = STATUS_INVALID_PARAMETER;
- server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); return status; }
@@ -6004,14 +6000,14 @@ NTSTATUS WINAPI NtResetWriteWatch( HANDLE process, PVOID base, SIZE_T size )
if (!size) return STATUS_INVALID_PARAMETER;
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset );
if (is_write_watch_range( base, size )) reset_write_watches( base, size ); else status = STATUS_INVALID_PARAMETER;
- server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); return status; }
@@ -6088,7 +6084,7 @@ NTSTATUS WINAPI NtAreMappedFilesTheSame(PVOID addr1, PVOID addr2)
TRACE("%p %p\n", addr1, addr2);
- server_enter_uninterrupted_section( &virtual_mutex, &sigset ); + server_enter_uninterrupted_section_recursive( &virtual_mutex, &sigset );
view1 = find_view( addr1, 0 ); view2 = find_view( addr2, 0 ); @@ -6112,7 +6108,7 @@ NTSTATUS WINAPI NtAreMappedFilesTheSame(PVOID addr1, PVOID addr2) SERVER_END_REQ; }
- server_leave_uninterrupted_section( &virtual_mutex, &sigset ); + server_leave_uninterrupted_section_recursive( &virtual_mutex, &sigset ); return status; }