diff --git a/dlls/kernel32/kernel_main.c b/dlls/kernel32/kernel_main.c index f6eeba99ba7..9f6b3114687 100644 --- a/dlls/kernel32/kernel_main.c +++ b/dlls/kernel32/kernel_main.c @@ -43,29 +43,6 @@ extern int __wine_set_signal_handler(unsigned, int (*)(unsigned)); -static CRITICAL_SECTION ldt_section; -static CRITICAL_SECTION_DEBUG critsect_debug = -{ - 0, 0, &ldt_section, - { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList }, - 0, 0, { (DWORD_PTR)(__FILE__ ": ldt_section") } -}; -static CRITICAL_SECTION ldt_section = { &critsect_debug, -1, 0, 0, 0, 0 }; - -/*********************************************************************** - * locking for LDT routines - */ -static void ldt_lock(void) -{ - RtlEnterCriticalSection( &ldt_section ); -} - -static void ldt_unlock(void) -{ - RtlLeaveCriticalSection( &ldt_section ); -} - - /*********************************************************************** * KERNEL thread initialisation routine */ @@ -141,9 +118,6 @@ static BOOL process_attach(void) } #endif - /* initialize LDT locking */ - wine_ldt_init_locking( ldt_lock, ldt_unlock ); - /* finish the process initialisation for console bits, if needed */ __wine_set_signal_handler(SIGINT, CONSOLE_HandleCtrlC); diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c index 356ba11dc68..4d991958490 100644 --- a/dlls/ntdll/thread.c +++ b/dlls/ntdll/thread.c @@ -63,6 +63,41 @@ static ULONG sigstack_zero_bits; struct wine_pthread_functions pthread_functions = { NULL }; + +static RTL_CRITICAL_SECTION ldt_section; +static RTL_CRITICAL_SECTION_DEBUG critsect_debug = +{ + 0, 0, &ldt_section, + { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList }, + 0, 0, { (DWORD_PTR)(__FILE__ ": ldt_section") } +}; +static RTL_CRITICAL_SECTION ldt_section = { &critsect_debug, -1, 0, 0, 0, 0 }; +static sigset_t ldt_sigset; + +/*********************************************************************** + * locking for LDT routines + */ +static void ldt_lock(void) +{ + sigset_t sigset; + + pthread_functions.sigprocmask( SIG_BLOCK, &server_block_set, &sigset ); + RtlEnterCriticalSection( &ldt_section ); + if (ldt_section.RecursionCount == 1) ldt_sigset = sigset; +} + +static void ldt_unlock(void) +{ + if (ldt_section.RecursionCount == 1) + { + sigset_t sigset = ldt_sigset; + RtlLeaveCriticalSection( &ldt_section ); + pthread_functions.sigprocmask( SIG_SETMASK, &sigset, NULL ); + } + else RtlLeaveCriticalSection( &ldt_section ); +} + + /*********************************************************************** * init_teb */ @@ -285,6 +320,10 @@ HANDLE thread_init(void) wine_server_fd_to_handle( 1, GENERIC_WRITE|SYNCHRONIZE, OBJ_INHERIT, ¶ms.hStdOutput ); wine_server_fd_to_handle( 2, GENERIC_WRITE|SYNCHRONIZE, OBJ_INHERIT, ¶ms.hStdError ); } + + /* initialize LDT locking */ + wine_ldt_init_locking( ldt_lock, ldt_unlock ); + return exe_file; }