From 531ff0be2601f1e25f01822f0bb0fcd2a655664e Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 3 Jul 2008 20:18:23 +0200 Subject: [PATCH] ntdll: Split the signal setup into process-wide and thread-specific routines. --- dlls/ntdll/ntdll_misc.h | 3 ++- dlls/ntdll/server.c | 2 +- dlls/ntdll/signal_i386.c | 25 ++++++++++++++----------- dlls/ntdll/signal_powerpc.c | 17 ++++++++++++----- dlls/ntdll/signal_sparc.c | 16 ++++++++++++---- dlls/ntdll/signal_x86_64.c | 16 ++++++++++++---- dlls/ntdll/thread.c | 2 +- 7 files changed, 54 insertions(+), 27 deletions(-) diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index 6f428e0a2aa..3317a6ac791 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -53,7 +53,8 @@ extern NTSTATUS NTDLL_wait_for_multiple_objects( UINT count, const HANDLE *handl const LARGE_INTEGER *timeout, HANDLE signal_object ); /* init routines */ -extern BOOL SIGNAL_Init(void); +extern void signal_init_thread(void); +extern void signal_init_process(void); extern size_t get_signal_stack_total_size(void); extern void version_init( const WCHAR *appname ); extern void debug_init(void); diff --git a/dlls/ntdll/server.c b/dlls/ntdll/server.c index 3d8beee730d..6e41eb5d87d 100644 --- a/dlls/ntdll/server.c +++ b/dlls/ntdll/server.c @@ -985,7 +985,7 @@ NTSTATUS server_init_process_done(void) * We do need the handlers in place by the time the request is over, so * we set them up here. If we segfault between here and the server call * something is very wrong... */ - if (!SIGNAL_Init()) exit(1); + signal_init_process(); /* Signal the parent process to continue */ SERVER_START_REQ( init_process_done ) diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c index 9edbaa10cb5..4351844328e 100644 --- a/dlls/ntdll/signal_i386.c +++ b/dlls/ntdll/signal_i386.c @@ -1533,12 +1533,10 @@ int __wine_set_signal_handler(unsigned int sig, wine_signal_handler wsh) /********************************************************************** - * SIGNAL_Init + * signal_init_thread */ -BOOL SIGNAL_Init(void) +void signal_init_thread(void) { - struct sigaction sig_act; - #ifdef HAVE_SIGALTSTACK stack_t ss; @@ -1553,12 +1551,16 @@ BOOL SIGNAL_Init(void) ss.ss_sp = get_signal_stack(); ss.ss_size = signal_stack_size; ss.ss_flags = 0; - if (sigaltstack(&ss, NULL) == -1) - { - perror( "sigaltstack" ); - return FALSE; - } + if (sigaltstack(&ss, NULL) == -1) perror( "sigaltstack" ); #endif /* HAVE_SIGALTSTACK */ +} + +/********************************************************************** + * signal_init_process + */ +void signal_init_process(void) +{ + struct sigaction sig_act; sig_act.sa_mask = server_block_set; sig_act.sa_flags = SA_SIGINFO | SA_RESTART; @@ -1594,11 +1596,12 @@ BOOL SIGNAL_Init(void) if (sigaction( SIGUSR2, &sig_act, NULL ) == -1) goto error; #endif - return TRUE; + signal_init_thread(); + return; error: perror("sigaction"); - return FALSE; + exit(1); } diff --git a/dlls/ntdll/signal_powerpc.c b/dlls/ntdll/signal_powerpc.c index a468754ea30..e65591b8d63 100644 --- a/dlls/ntdll/signal_powerpc.c +++ b/dlls/ntdll/signal_powerpc.c @@ -648,9 +648,16 @@ int __wine_set_signal_handler(unsigned int sig, wine_signal_handler wsh) /********************************************************************** - * SIGNAL_Init + * signal_init_thread */ -BOOL SIGNAL_Init(void) +void signal_init_thread(void) +{ +} + +/********************************************************************** + * signal_init_process + */ +void signal_init_process(void) { if (set_handler( SIGINT, (void (*)())int_handler ) == -1) goto error; if (set_handler( SIGFPE, (void (*)())fpe_handler ) == -1) goto error; @@ -665,12 +672,12 @@ BOOL SIGNAL_Init(void) #ifdef SIGTRAP if (set_handler( SIGTRAP, (void (*)())trap_handler ) == -1) goto error; #endif - - return TRUE; + signal_init_thread(); + return; error: perror("sigaction"); - return FALSE; + exit(1); } diff --git a/dlls/ntdll/signal_sparc.c b/dlls/ntdll/signal_sparc.c index d72269a568c..d3896f36f47 100644 --- a/dlls/ntdll/signal_sparc.c +++ b/dlls/ntdll/signal_sparc.c @@ -457,9 +457,16 @@ int __wine_set_signal_handler(unsigned int sig, wine_signal_handler wsh) /********************************************************************** - * SIGNAL_Init + * signal_init_thread */ -BOOL SIGNAL_Init(void) +void signal_init_thread(void) +{ +} + +/********************************************************************** + * signal_init_process + */ +void signal_init_process(void) { if (set_handler( SIGINT, (void (*)())int_handler ) == -1) goto error; if (set_handler( SIGFPE, (void (*)())fpe_handler ) == -1) goto error; @@ -476,11 +483,12 @@ BOOL SIGNAL_Init(void) this is correct, because that is what x86 does, or it is harmful because it could obscure problems in user code */ asm("ta 6"); /* 6 == ST_FIX_ALIGN defined in sys/trap.h */ - return TRUE; + signal_init_thread(); + return; error: perror("sigaction"); - return FALSE; + exit(1); } diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index 8225c6a5061..a7a0d3b441b 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -481,9 +481,16 @@ int __wine_set_signal_handler(unsigned int sig, wine_signal_handler wsh) /********************************************************************** - * SIGNAL_Init + * signal_init_thread */ -BOOL SIGNAL_Init(void) +void signal_init_thread(void) +{ +} + +/********************************************************************** + * signal_init_process + */ +void signal_init_process(void) { if (set_handler( SIGINT, (void (*)())int_handler ) == -1) goto error; if (set_handler( SIGFPE, (void (*)())fpe_handler ) == -1) goto error; @@ -498,11 +505,12 @@ BOOL SIGNAL_Init(void) #ifdef SIGTRAP if (set_handler( SIGTRAP, (void (*)())trap_handler ) == -1) goto error; #endif - return TRUE; + signal_init_thread(); + return; error: perror("sigaction"); - return FALSE; + exit(1); } diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c index 4298e9593ba..9411db10878 100644 --- a/dlls/ntdll/thread.c +++ b/dlls/ntdll/thread.c @@ -424,7 +424,7 @@ static void start_thread( struct wine_pthread_thread_info *info ) thread_data->debug_info = &debug_info; pthread_functions.init_current_teb( info ); - SIGNAL_Init(); + signal_init_thread(); server_init_thread( info->pid, info->tid, func ); pthread_functions.init_thread( info ); virtual_alloc_thread_stack( info->stack_base, info->stack_size ); -- 2.11.4.GIT