Alexandre Julliard : ntdll: Don't lock mutexes during process exit.
Alexandre Julliard
julliard at winehq.org
Tue Sep 22 15:46:40 CDT 2020
Module: wine
Branch: master
Commit: 9c8dce215512ac42ed657ce0dd6681712a4c29c3
URL: https://source.winehq.org/git/wine.git/?a=commit;h=9c8dce215512ac42ed657ce0dd6681712a4c29c3
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Sep 22 11:28:41 2020 +0200
ntdll: Don't lock mutexes during process exit.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/unix/process.c | 5 ++---
dlls/ntdll/unix/server.c | 1 +
dlls/ntdll/unix/unix_private.h | 5 +++--
3 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/dlls/ntdll/unix/process.c b/dlls/ntdll/unix/process.c
index 64380aba03..3e0bd02a59 100644
--- a/dlls/ntdll/unix/process.c
+++ b/dlls/ntdll/unix/process.c
@@ -1042,7 +1042,6 @@ done:
*/
NTSTATUS WINAPI NtTerminateProcess( HANDLE handle, LONG exit_code )
{
- static BOOL clean_exit;
NTSTATUS ret;
BOOL self;
@@ -1056,8 +1055,8 @@ NTSTATUS WINAPI NtTerminateProcess( HANDLE handle, LONG exit_code )
SERVER_END_REQ;
if (self)
{
- if (!handle) clean_exit = TRUE;
- else if (clean_exit) exit_process( exit_code );
+ if (!handle) process_exiting = TRUE;
+ else if (process_exiting) exit_process( exit_code );
else abort_process( exit_code );
}
return ret;
diff --git a/dlls/ntdll/unix/server.c b/dlls/ntdll/unix/server.c
index b9ec66537a..81a903ca77 100644
--- a/dlls/ntdll/unix/server.c
+++ b/dlls/ntdll/unix/server.c
@@ -105,6 +105,7 @@ static const char *server_dir;
unsigned int server_cpus = 0;
BOOL is_wow64 = FALSE;
+BOOL process_exiting = FALSE;
timeout_t server_start_time = 0; /* time of server startup */
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h
index c737a3a842..3d9dca3c51 100644
--- a/dlls/ntdll/unix/unix_private.h
+++ b/dlls/ntdll/unix/unix_private.h
@@ -132,6 +132,7 @@ extern char **main_envp DECLSPEC_HIDDEN;
extern WCHAR **main_wargv DECLSPEC_HIDDEN;
extern unsigned int server_cpus DECLSPEC_HIDDEN;
extern BOOL is_wow64 DECLSPEC_HIDDEN;
+extern BOOL process_exiting DECLSPEC_HIDDEN;
extern HANDLE keyed_event DECLSPEC_HIDDEN;
extern timeout_t server_start_time DECLSPEC_HIDDEN;
extern sigset_t server_block_set DECLSPEC_HIDDEN;
@@ -280,12 +281,12 @@ static inline void *get_signal_stack(void)
static inline void mutex_lock( pthread_mutex_t *mutex )
{
- pthread_mutex_lock( mutex );
+ if (!process_exiting) pthread_mutex_lock( mutex );
}
static inline void mutex_unlock( pthread_mutex_t *mutex )
{
- pthread_mutex_unlock( mutex );
+ if (!process_exiting) pthread_mutex_unlock( mutex );
}
#ifndef _WIN64
More information about the wine-cvs
mailing list