Commit 21d631e2 authored by Alexandre Julliard's avatar Alexandre Julliard

ntdll: Move the LDT section to ntdll and make it an uninterruptible section.

parent 3ccf5012
......@@ -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);
......
......@@ -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, &params.hStdOutput );
wine_server_fd_to_handle( 2, GENERIC_WRITE|SYNCHRONIZE, OBJ_INHERIT, &params.hStdError );
}
/* initialize LDT locking */
wine_ldt_init_locking( ldt_lock, ldt_unlock );
return exe_file;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment