From cc933f586af2a29de423a378edf232675b572014 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Fri, 20 Feb 2009 11:23:08 +0100 Subject: [PATCH] ntdll: Moved exit_thread and abort_thread functions to thread.c. --- dlls/ntdll/ntdll_misc.h | 3 +- dlls/ntdll/server.c | 65 ++++--------------------------------- dlls/ntdll/signal_i386.c | 8 ++--- dlls/ntdll/signal_powerpc.c | 2 +- dlls/ntdll/signal_sparc.c | 2 +- dlls/ntdll/signal_x86_64.c | 2 +- dlls/ntdll/sync.c | 2 +- dlls/ntdll/thread.c | 61 +++++++++++++++++++++++++++++++--- 8 files changed, 71 insertions(+), 74 deletions(-) diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index 90c74a92993..3dd20d6ca30 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -73,8 +73,7 @@ extern NTSTATUS server_init_process_done(void); extern size_t server_init_thread( void *entry_point ); extern void DECLSPEC_NORETURN server_protocol_error( const char *err, ... ); extern void DECLSPEC_NORETURN server_protocol_perror( const char *err ); -extern void DECLSPEC_NORETURN server_exit_thread( int status ); -extern void DECLSPEC_NORETURN server_abort_thread( int status ); +extern void DECLSPEC_NORETURN abort_thread( int status ); extern sigset_t server_block_set; extern void server_enter_uninterrupted_section( RTL_CRITICAL_SECTION *cs, sigset_t *sigset ); extern void server_leave_uninterrupted_section( RTL_CRITICAL_SECTION *cs, sigset_t *sigset ); diff --git a/dlls/ntdll/server.c b/dlls/ntdll/server.c index a56557a04c6..d16a248b309 100644 --- a/dlls/ntdll/server.c +++ b/dlls/ntdll/server.c @@ -62,7 +62,6 @@ #include "ntstatus.h" #define WIN32_NO_STATUS #include "wine/library.h" -#include "wine/pthread.h" #include "wine/server.h" #include "wine/debug.h" #include "ntdll_misc.h" @@ -93,8 +92,6 @@ struct cmsg_fd timeout_t server_start_time = 0; /* time of server startup */ -extern struct wine_pthread_functions pthread_functions; - sigset_t server_block_set; /* signals to block during server calls */ static int fd_socket = -1; /* socket to exchange file descriptors with the server */ @@ -140,56 +137,6 @@ static void fatal_perror( const char *err, ... ) } -/*********************************************************************** - * server_exit_thread - */ -void server_exit_thread( int status ) -{ - struct wine_pthread_thread_info info; - int fds[4]; - - RtlAcquirePebLock(); - RemoveEntryList( &NtCurrentTeb()->TlsLinks ); - RtlReleasePebLock(); - RtlFreeHeap( GetProcessHeap(), 0, NtCurrentTeb()->FlsSlots ); - RtlFreeHeap( GetProcessHeap(), 0, NtCurrentTeb()->TlsExpansionSlots ); - - info.stack_base = NtCurrentTeb()->DeallocationStack; - info.teb_base = NtCurrentTeb(); - info.teb_sel = wine_get_fs(); - info.exit_status = status; - - fds[0] = ntdll_get_thread_data()->wait_fd[0]; - fds[1] = ntdll_get_thread_data()->wait_fd[1]; - fds[2] = ntdll_get_thread_data()->reply_fd; - fds[3] = ntdll_get_thread_data()->request_fd; - pthread_sigmask( SIG_BLOCK, &server_block_set, NULL ); - - info.stack_size = virtual_free_system_view( &info.stack_base ); - info.teb_size = virtual_free_system_view( &info.teb_base ); - - close( fds[0] ); - close( fds[1] ); - close( fds[2] ); - close( fds[3] ); - pthread_functions.exit_thread( &info ); -} - - -/*********************************************************************** - * server_abort_thread - */ -void server_abort_thread( int status ) -{ - pthread_sigmask( SIG_BLOCK, &server_block_set, NULL ); - close( ntdll_get_thread_data()->wait_fd[0] ); - close( ntdll_get_thread_data()->wait_fd[1] ); - close( ntdll_get_thread_data()->reply_fd ); - close( ntdll_get_thread_data()->request_fd ); - pthread_functions.abort_thread( status ); -} - - /*********************************************************************** * server_protocol_error */ @@ -201,7 +148,7 @@ void server_protocol_error( const char *err, ... ) fprintf( stderr, "wine client error:%x: ", GetCurrentThreadId() ); vfprintf( stderr, err, args ); va_end( args ); - server_abort_thread(1); + abort_thread(1); } @@ -212,7 +159,7 @@ void server_protocol_perror( const char *err ) { fprintf( stderr, "wine client error:%x: ", GetCurrentThreadId() ); perror( err ); - server_abort_thread(1); + abort_thread(1); } @@ -248,7 +195,7 @@ static unsigned int send_request( const struct __server_request_info *req ) } if (ret >= 0) server_protocol_error( "partial write %d\n", ret ); - if (errno == EPIPE) server_abort_thread(0); + if (errno == EPIPE) abort_thread(0); if (errno == EFAULT) return STATUS_ACCESS_VIOLATION; server_protocol_perror( "write" ); } @@ -277,7 +224,7 @@ static void read_reply_data( void *buffer, size_t size ) server_protocol_perror("read"); } /* the server closed the connection; time to die... */ - server_abort_thread(0); + abort_thread(0); } @@ -401,7 +348,7 @@ void CDECL wine_server_send_fd( int fd ) if ((ret = sendmsg( fd_socket, &msghdr, 0 )) == sizeof(data)) return; if (ret >= 0) server_protocol_error( "partial write %d\n", ret ); if (errno == EINTR) continue; - if (errno == EPIPE) server_abort_thread(0); + if (errno == EPIPE) abort_thread(0); server_protocol_perror( "sendmsg" ); } } @@ -459,7 +406,7 @@ static int receive_fd( obj_handle_t *handle ) server_protocol_perror("recvmsg"); } /* the server closed the connection; time to die... */ - server_abort_thread(0); + abort_thread(0); } diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c index 790d9ca2445..32db8101bb9 100644 --- a/dlls/ntdll/signal_i386.c +++ b/dlls/ntdll/signal_i386.c @@ -1109,7 +1109,7 @@ static EXCEPTION_RECORD *setup_exception_record( SIGCONTEXT *sigcontext, void *s GetCurrentThreadId(), (unsigned int) EIP_sig(sigcontext), (unsigned int) ESP_sig(sigcontext), NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase ); - server_abort_thread(1); + abort_thread(1); } if (stack - 1 > stack || /* check for overflow in subtraction */ @@ -1129,7 +1129,7 @@ static EXCEPTION_RECORD *setup_exception_record( SIGCONTEXT *sigcontext, void *s diff, GetCurrentThreadId(), (unsigned int) EIP_sig(sigcontext), (unsigned int) ESP_sig(sigcontext), NtCurrentTeb()->DeallocationStack, NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase ); - server_abort_thread(1); + abort_thread(1); } else if ((char *)(stack - 1) < (char *)NtCurrentTeb()->Tib.StackLimit) { @@ -1142,7 +1142,7 @@ static EXCEPTION_RECORD *setup_exception_record( SIGCONTEXT *sigcontext, void *s diff, GetCurrentThreadId(), (unsigned int) EIP_sig(sigcontext), (unsigned int) ESP_sig(sigcontext), NtCurrentTeb()->DeallocationStack, NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase ); - server_abort_thread(1); + abort_thread(1); } } @@ -1550,7 +1550,7 @@ static void quit_handler( int signal, siginfo_t *siginfo, void *sigcontext ) { WORD fs, gs; init_handler( sigcontext, &fs, &gs ); - server_abort_thread(0); + abort_thread(0); } diff --git a/dlls/ntdll/signal_powerpc.c b/dlls/ntdll/signal_powerpc.c index 084c3516aee..f3054bf2f0f 100644 --- a/dlls/ntdll/signal_powerpc.c +++ b/dlls/ntdll/signal_powerpc.c @@ -584,7 +584,7 @@ static HANDLER_DEF(abrt_handler) */ static HANDLER_DEF(quit_handler) { - server_abort_thread(0); + abort_thread(0); } diff --git a/dlls/ntdll/signal_sparc.c b/dlls/ntdll/signal_sparc.c index dddc183b287..9ac74060002 100644 --- a/dlls/ntdll/signal_sparc.c +++ b/dlls/ntdll/signal_sparc.c @@ -397,7 +397,7 @@ static HANDLER_DEF(abrt_handler) */ static HANDLER_DEF(quit_handler) { - server_abort_thread(0); + abort_thread(0); } diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index 86f2f37cc13..f46f034e2dd 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -472,7 +472,7 @@ static HANDLER_DEF(abrt_handler) */ static HANDLER_DEF(quit_handler) { - server_abort_thread(0); + abort_thread(0); } diff --git a/dlls/ntdll/sync.c b/dlls/ntdll/sync.c index d42eb643cc8..9039ff0ca16 100644 --- a/dlls/ntdll/sync.c +++ b/dlls/ntdll/sync.c @@ -831,7 +831,7 @@ static int wait_reply( void *cookie ) server_protocol_perror("wakeup read"); } /* the server closed the connection; time to die... */ - server_abort_thread(0); + abort_thread(0); } diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c index 255c523633a..eeb98c3f598 100644 --- a/dlls/ntdll/thread.c +++ b/dlls/ntdll/thread.c @@ -68,7 +68,7 @@ static LIST_ENTRY tls_links; static size_t sigstack_total_size; static ULONG sigstack_zero_bits; -struct wine_pthread_functions pthread_functions = { NULL }; +static struct wine_pthread_functions pthread_functions; static RTL_CRITICAL_SECTION ldt_section; @@ -346,6 +346,57 @@ HANDLE thread_init(void) return exe_file; } + +/*********************************************************************** + * abort_thread + */ +void abort_thread( int status ) +{ + pthread_sigmask( SIG_BLOCK, &server_block_set, NULL ); + close( ntdll_get_thread_data()->wait_fd[0] ); + close( ntdll_get_thread_data()->wait_fd[1] ); + close( ntdll_get_thread_data()->reply_fd ); + close( ntdll_get_thread_data()->request_fd ); + pthread_functions.abort_thread( status ); +} + + +/*********************************************************************** + * exit_thread + */ +static void DECLSPEC_NORETURN exit_thread( int status ) +{ + struct wine_pthread_thread_info info; + int fds[4]; + + RtlAcquirePebLock(); + RemoveEntryList( &NtCurrentTeb()->TlsLinks ); + RtlReleasePebLock(); + RtlFreeHeap( GetProcessHeap(), 0, NtCurrentTeb()->FlsSlots ); + RtlFreeHeap( GetProcessHeap(), 0, NtCurrentTeb()->TlsExpansionSlots ); + + info.stack_base = NtCurrentTeb()->DeallocationStack; + info.teb_base = NtCurrentTeb(); + info.teb_sel = wine_get_fs(); + info.exit_status = status; + + fds[0] = ntdll_get_thread_data()->wait_fd[0]; + fds[1] = ntdll_get_thread_data()->wait_fd[1]; + fds[2] = ntdll_get_thread_data()->reply_fd; + fds[3] = ntdll_get_thread_data()->request_fd; + pthread_sigmask( SIG_BLOCK, &server_block_set, NULL ); + + info.stack_size = virtual_free_system_view( &info.stack_base ); + info.teb_size = virtual_free_system_view( &info.teb_base ); + + close( fds[0] ); + close( fds[1] ); + close( fds[2] ); + close( fds[3] ); + pthread_functions.exit_thread( &info ); +} + + #ifdef __i386__ /* wrapper for apps that don't declare the thread function correctly */ extern DWORD call_thread_entry_point( PRTL_THREAD_START_ROUTINE entry, void *arg ); @@ -401,7 +452,7 @@ static void DECLSPEC_NORETURN call_thread_func( PRTL_THREAD_START_ROUTINE rtl_fu else { LdrShutdownThread(); - server_exit_thread( exit_code ); + exit_thread( exit_code ); } } @@ -624,7 +675,7 @@ void WINAPI RtlExitUserThread( ULONG status ) else { LdrShutdownThread(); - server_exit_thread( status ); + exit_thread( status ); } } @@ -730,8 +781,8 @@ NTSTATUS WINAPI NtTerminateThread( HANDLE handle, LONG exit_code ) if (self) { - if (last) exit( exit_code ); - else server_abort_thread( exit_code ); + if (last) _exit( exit_code ); + else abort_thread( exit_code ); } return ret; }