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