Alexandre Julliard : ntdll: Move more of the thread exit code to the Unix library.
Alexandre Julliard
julliard at winehq.org
Wed Jun 3 16:40:55 CDT 2020
Module: wine
Branch: master
Commit: f1d40d4824b568389cbc328cebb5734430b52e44
URL: https://source.winehq.org/git/wine.git/?a=commit;h=f1d40d4824b568389cbc328cebb5734430b52e44
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Jun 3 21:26:47 2020 +0200
ntdll: Move more of the thread exit code to the Unix library.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/thread.c | 17 -----------------
dlls/ntdll/unix/loader.c | 1 -
dlls/ntdll/unix/thread.c | 14 ++++++++++++++
dlls/ntdll/unix/unix_private.h | 2 +-
dlls/ntdll/unix/virtual.c | 2 +-
dlls/ntdll/unixlib.h | 3 +--
6 files changed, 17 insertions(+), 22 deletions(-)
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index d7386f2ab1..d5e34cae3b 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -284,9 +284,6 @@ TEB *thread_init(void)
*/
void WINAPI RtlExitUserThread( ULONG status )
{
- static void *prev_teb;
- TEB *teb;
-
if (status) /* send the exit code to the server (0 is already the default) */
{
SERVER_START_REQ( terminate_thread )
@@ -306,20 +303,6 @@ void WINAPI RtlExitUserThread( ULONG status )
LdrShutdownThread();
RtlFreeThreadActivationContextStack();
-
- pthread_sigmask( SIG_BLOCK, &server_block_set, NULL );
-
- if ((teb = InterlockedExchangePointer( &prev_teb, NtCurrentTeb() )))
- {
- struct ntdll_thread_data *thread_data = (struct ntdll_thread_data *)&teb->GdiTebBatch;
-
- if (thread_data->pthread_id)
- {
- pthread_join( thread_data->pthread_id, NULL );
- unix_funcs->virtual_free_teb( teb );
- }
- }
-
for (;;) unix_funcs->exit_thread( status );
}
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
index 30e1fa61b4..1297c451a1 100644
--- a/dlls/ntdll/unix/loader.c
+++ b/dlls/ntdll/unix/loader.c
@@ -1017,7 +1017,6 @@ static struct unix_funcs unix_funcs =
virtual_get_system_info,
virtual_create_builtin_view,
virtual_alloc_first_teb,
- virtual_free_teb,
virtual_alloc_thread_stack,
virtual_handle_fault,
virtual_locked_server_call,
diff --git a/dlls/ntdll/unix/thread.c b/dlls/ntdll/unix/thread.c
index eaed27f4b2..205a1312e9 100644
--- a/dlls/ntdll/unix/thread.c
+++ b/dlls/ntdll/unix/thread.c
@@ -218,7 +218,21 @@ void CDECL abort_thread( int status )
*/
void CDECL exit_thread( int status )
{
+ static void *prev_teb;
+ TEB *teb;
+
pthread_sigmask( SIG_BLOCK, &server_block_set, NULL );
+
+ if ((teb = InterlockedExchangePointer( &prev_teb, NtCurrentTeb() )))
+ {
+ struct ntdll_thread_data *thread_data = (struct ntdll_thread_data *)&teb->GdiTebBatch;
+
+ if (thread_data->pthread_id)
+ {
+ pthread_join( thread_data->pthread_id, NULL );
+ virtual_free_teb( teb );
+ }
+ }
signal_exit_thread( status, pthread_exit_wrapper );
}
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h
index eeadf33f1c..14c4ee4cd9 100644
--- a/dlls/ntdll/unix/unix_private.h
+++ b/dlls/ntdll/unix/unix_private.h
@@ -63,7 +63,6 @@ extern NTSTATUS CDECL virtual_map_section( HANDLE handle, PVOID *addr_ptr, unsig
extern void CDECL virtual_get_system_info( SYSTEM_BASIC_INFORMATION *info ) DECLSPEC_HIDDEN;
extern NTSTATUS CDECL virtual_create_builtin_view( void *module ) DECLSPEC_HIDDEN;
extern TEB * CDECL virtual_alloc_first_teb(void) DECLSPEC_HIDDEN;
-extern void CDECL virtual_free_teb( TEB *teb ) DECLSPEC_HIDDEN;
extern NTSTATUS CDECL virtual_alloc_thread_stack( INITIAL_TEB *stack, SIZE_T reserve_size, SIZE_T commit_size, SIZE_T *pthread_size ) DECLSPEC_HIDDEN;
extern NTSTATUS CDECL virtual_handle_fault( LPCVOID addr, DWORD err, BOOL on_signal_stack ) DECLSPEC_HIDDEN;
extern unsigned int CDECL virtual_locked_server_call( void *req_ptr ) DECLSPEC_HIDDEN;
@@ -134,6 +133,7 @@ extern NTSTATUS set_thread_context( HANDLE handle, const context_t *context, BOO
extern NTSTATUS get_thread_context( HANDLE handle, context_t *context, unsigned int flags, BOOL *self ) DECLSPEC_HIDDEN;
extern NTSTATUS virtual_alloc_teb( TEB **ret_teb ) DECLSPEC_HIDDEN;
+extern void virtual_free_teb( TEB *teb ) DECLSPEC_HIDDEN;
extern void signal_init_threading(void) DECLSPEC_HIDDEN;
extern NTSTATUS signal_alloc_thread( TEB *teb ) DECLSPEC_HIDDEN;
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
index b32a004dae..58ecaa6fc4 100644
--- a/dlls/ntdll/unix/virtual.c
+++ b/dlls/ntdll/unix/virtual.c
@@ -2628,7 +2628,7 @@ NTSTATUS virtual_alloc_teb( TEB **ret_teb )
/***********************************************************************
* virtual_free_teb
*/
-void CDECL virtual_free_teb( TEB *teb )
+void virtual_free_teb( TEB *teb )
{
struct ntdll_thread_data *thread_data = (struct ntdll_thread_data *)&teb->GdiTebBatch;
SIZE_T size;
diff --git a/dlls/ntdll/unixlib.h b/dlls/ntdll/unixlib.h
index a72cd72dc7..67c63fd926 100644
--- a/dlls/ntdll/unixlib.h
+++ b/dlls/ntdll/unixlib.h
@@ -28,7 +28,7 @@ struct ldt_copy;
struct msghdr;
/* increment this when you change the function table */
-#define NTDLL_UNIXLIB_VERSION 18
+#define NTDLL_UNIXLIB_VERSION 19
struct unix_funcs
{
@@ -92,7 +92,6 @@ struct unix_funcs
void (CDECL *virtual_get_system_info)( SYSTEM_BASIC_INFORMATION *info );
NTSTATUS (CDECL *virtual_create_builtin_view)( void *module );
TEB * (CDECL *virtual_alloc_first_teb)(void);
- void (CDECL *virtual_free_teb)( TEB *teb );
NTSTATUS (CDECL *virtual_alloc_thread_stack)( INITIAL_TEB *stack, SIZE_T reserve_size, SIZE_T commit_size, SIZE_T *pthread_size );
NTSTATUS (CDECL *virtual_handle_fault)( LPCVOID addr, DWORD err, BOOL on_signal_stack );
unsigned int (CDECL *virtual_locked_server_call)( void *req_ptr );
More information about the wine-cvs
mailing list