ntdll: Make the server signal mask global.
This commit is contained in:
parent
fb75c66897
commit
c388c58b9f
@ -63,8 +63,9 @@ 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_protocol_perror( const char *err );
|
||||||
extern void DECLSPEC_NORETURN server_exit_thread( int status );
|
extern void DECLSPEC_NORETURN server_exit_thread( int status );
|
||||||
extern void DECLSPEC_NORETURN server_abort_thread( int status );
|
extern void DECLSPEC_NORETURN server_abort_thread( int status );
|
||||||
void server_enter_uninterrupted_section( RTL_CRITICAL_SECTION *cs, sigset_t *sigset );
|
extern sigset_t server_block_set;
|
||||||
void server_leave_uninterrupted_section( RTL_CRITICAL_SECTION *cs, sigset_t *sigset );
|
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 );
|
||||||
extern int server_remove_fd_from_cache( obj_handle_t handle );
|
extern int server_remove_fd_from_cache( obj_handle_t handle );
|
||||||
extern int server_get_unix_fd( obj_handle_t handle, unsigned int access, int *unix_fd,
|
extern int server_get_unix_fd( obj_handle_t handle, unsigned int access, int *unix_fd,
|
||||||
int *needs_close, enum server_fd_type *type, int *flags );
|
int *needs_close, enum server_fd_type *type, int *flags );
|
||||||
|
@ -89,7 +89,7 @@ abs_time_t server_start_time = { 0, 0 }; /* time of server startup */
|
|||||||
|
|
||||||
extern struct wine_pthread_functions pthread_functions;
|
extern struct wine_pthread_functions pthread_functions;
|
||||||
|
|
||||||
static sigset_t block_set; /* signals to block during server calls */
|
sigset_t server_block_set; /* signals to block during server calls */
|
||||||
static int fd_socket = -1; /* socket to exchange file descriptors with the server */
|
static int fd_socket = -1; /* socket to exchange file descriptors with the server */
|
||||||
|
|
||||||
static RTL_CRITICAL_SECTION fd_cache_section;
|
static RTL_CRITICAL_SECTION fd_cache_section;
|
||||||
@ -156,7 +156,7 @@ void server_exit_thread( int status )
|
|||||||
fds[1] = ntdll_get_thread_data()->wait_fd[1];
|
fds[1] = ntdll_get_thread_data()->wait_fd[1];
|
||||||
fds[2] = ntdll_get_thread_data()->reply_fd;
|
fds[2] = ntdll_get_thread_data()->reply_fd;
|
||||||
fds[3] = ntdll_get_thread_data()->request_fd;
|
fds[3] = ntdll_get_thread_data()->request_fd;
|
||||||
pthread_functions.sigprocmask( SIG_BLOCK, &block_set, NULL );
|
pthread_functions.sigprocmask( SIG_BLOCK, &server_block_set, NULL );
|
||||||
|
|
||||||
size = 0;
|
size = 0;
|
||||||
NtFreeVirtualMemory( GetCurrentProcess(), &info.stack_base, &size, MEM_RELEASE | MEM_SYSTEM );
|
NtFreeVirtualMemory( GetCurrentProcess(), &info.stack_base, &size, MEM_RELEASE | MEM_SYSTEM );
|
||||||
@ -179,7 +179,7 @@ void server_exit_thread( int status )
|
|||||||
*/
|
*/
|
||||||
void server_abort_thread( int status )
|
void server_abort_thread( int status )
|
||||||
{
|
{
|
||||||
pthread_functions.sigprocmask( SIG_BLOCK, &block_set, NULL );
|
pthread_functions.sigprocmask( SIG_BLOCK, &server_block_set, NULL );
|
||||||
close( ntdll_get_thread_data()->wait_fd[0] );
|
close( ntdll_get_thread_data()->wait_fd[0] );
|
||||||
close( ntdll_get_thread_data()->wait_fd[1] );
|
close( ntdll_get_thread_data()->wait_fd[1] );
|
||||||
close( ntdll_get_thread_data()->reply_fd );
|
close( ntdll_get_thread_data()->reply_fd );
|
||||||
@ -318,7 +318,7 @@ unsigned int wine_server_call( void *req_ptr )
|
|||||||
struct __server_request_info * const req = req_ptr;
|
struct __server_request_info * const req = req_ptr;
|
||||||
sigset_t old_set;
|
sigset_t old_set;
|
||||||
|
|
||||||
pthread_functions.sigprocmask( SIG_BLOCK, &block_set, &old_set );
|
pthread_functions.sigprocmask( SIG_BLOCK, &server_block_set, &old_set );
|
||||||
send_request( req );
|
send_request( req );
|
||||||
wait_reply( req );
|
wait_reply( req );
|
||||||
pthread_functions.sigprocmask( SIG_SETMASK, &old_set, NULL );
|
pthread_functions.sigprocmask( SIG_SETMASK, &old_set, NULL );
|
||||||
@ -331,7 +331,7 @@ unsigned int wine_server_call( void *req_ptr )
|
|||||||
*/
|
*/
|
||||||
void server_enter_uninterrupted_section( RTL_CRITICAL_SECTION *cs, sigset_t *sigset )
|
void server_enter_uninterrupted_section( RTL_CRITICAL_SECTION *cs, sigset_t *sigset )
|
||||||
{
|
{
|
||||||
pthread_functions.sigprocmask( SIG_BLOCK, &block_set, sigset );
|
pthread_functions.sigprocmask( SIG_BLOCK, &server_block_set, sigset );
|
||||||
RtlEnterCriticalSection( cs );
|
RtlEnterCriticalSection( cs );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1010,14 +1010,14 @@ void server_init_process(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* setup the signal mask */
|
/* setup the signal mask */
|
||||||
sigemptyset( &block_set );
|
sigemptyset( &server_block_set );
|
||||||
sigaddset( &block_set, SIGALRM );
|
sigaddset( &server_block_set, SIGALRM );
|
||||||
sigaddset( &block_set, SIGIO );
|
sigaddset( &server_block_set, SIGIO );
|
||||||
sigaddset( &block_set, SIGINT );
|
sigaddset( &server_block_set, SIGINT );
|
||||||
sigaddset( &block_set, SIGHUP );
|
sigaddset( &server_block_set, SIGHUP );
|
||||||
sigaddset( &block_set, SIGUSR1 );
|
sigaddset( &server_block_set, SIGUSR1 );
|
||||||
sigaddset( &block_set, SIGUSR2 );
|
sigaddset( &server_block_set, SIGUSR2 );
|
||||||
sigaddset( &block_set, SIGCHLD );
|
sigaddset( &server_block_set, SIGCHLD );
|
||||||
|
|
||||||
/* receive the first thread request fd on the main socket */
|
/* receive the first thread request fd on the main socket */
|
||||||
ntdll_get_thread_data()->request_fd = receive_fd( &dummy_handle );
|
ntdll_get_thread_data()->request_fd = receive_fd( &dummy_handle );
|
||||||
|
@ -1341,12 +1341,8 @@ BOOL SIGNAL_Init(void)
|
|||||||
}
|
}
|
||||||
#endif /* HAVE_SIGALTSTACK */
|
#endif /* HAVE_SIGALTSTACK */
|
||||||
|
|
||||||
sigemptyset( &sig_act.sa_mask );
|
sig_act.sa_mask = server_block_set;
|
||||||
sigaddset( &sig_act.sa_mask, SIGINT );
|
|
||||||
sigaddset( &sig_act.sa_mask, SIGUSR1 );
|
|
||||||
sigaddset( &sig_act.sa_mask, SIGUSR2 );
|
|
||||||
sig_act.sa_flags = SA_SIGINFO | SA_RESTART;
|
sig_act.sa_flags = SA_SIGINFO | SA_RESTART;
|
||||||
|
|
||||||
#ifdef SA_ONSTACK
|
#ifdef SA_ONSTACK
|
||||||
sig_act.sa_flags |= SA_ONSTACK;
|
sig_act.sa_flags |= SA_ONSTACK;
|
||||||
#endif
|
#endif
|
||||||
|
@ -630,10 +630,7 @@ static int set_handler( int sig, void (*func)() )
|
|||||||
struct sigaction sig_act;
|
struct sigaction sig_act;
|
||||||
|
|
||||||
sig_act.sa_sigaction = func;
|
sig_act.sa_sigaction = func;
|
||||||
sigemptyset( &sig_act.sa_mask );
|
sig_act.sa_mask = server_block_set;
|
||||||
sigaddset( &sig_act.sa_mask, SIGINT );
|
|
||||||
sigaddset( &sig_act.sa_mask, SIGALRM );
|
|
||||||
|
|
||||||
sig_act.sa_flags = SA_RESTART | SA_SIGINFO;
|
sig_act.sa_flags = SA_RESTART | SA_SIGINFO;
|
||||||
return sigaction( sig, &sig_act, NULL );
|
return sigaction( sig, &sig_act, NULL );
|
||||||
}
|
}
|
||||||
|
@ -436,9 +436,8 @@ static int set_handler( int sig, void (*func)() )
|
|||||||
{
|
{
|
||||||
struct sigaction sig_act;
|
struct sigaction sig_act;
|
||||||
|
|
||||||
sig_act.sa_handler = NULL;
|
|
||||||
sig_act.sa_sigaction = func;
|
sig_act.sa_sigaction = func;
|
||||||
sigemptyset( &sig_act.sa_mask );
|
sig_act.sa_mask = server_block_set;
|
||||||
sig_act.sa_flags = SA_SIGINFO;
|
sig_act.sa_flags = SA_SIGINFO;
|
||||||
|
|
||||||
return sigaction( sig, &sig_act, NULL );
|
return sigaction( sig, &sig_act, NULL );
|
||||||
|
@ -462,10 +462,7 @@ static int set_handler( int sig, void (*func)() )
|
|||||||
struct sigaction sig_act;
|
struct sigaction sig_act;
|
||||||
|
|
||||||
sig_act.sa_sigaction = func;
|
sig_act.sa_sigaction = func;
|
||||||
sigemptyset( &sig_act.sa_mask );
|
sig_act.sa_mask = server_block_set;
|
||||||
sigaddset( &sig_act.sa_mask, SIGINT );
|
|
||||||
sigaddset( &sig_act.sa_mask, SIGUSR2 );
|
|
||||||
|
|
||||||
sig_act.sa_flags = SA_RESTART | SA_SIGINFO | SA_ONSTACK;
|
sig_act.sa_flags = SA_RESTART | SA_SIGINFO | SA_ONSTACK;
|
||||||
return sigaction( sig, &sig_act, NULL );
|
return sigaction( sig, &sig_act, NULL );
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user