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

This commit is contained in:
Alexandre Julliard 2007-01-18 15:01:45 +01:00
parent 3ccf501209
commit 21d631e270
2 changed files with 39 additions and 26 deletions

View File

@ -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);

View File

@ -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;
}