Drop has_set_thread_stack_guarantee flag

This commit is contained in:
Corinna Vinschen 2015-12-15 16:00:20 +01:00
parent 8b8c6c014b
commit 23a556f2c5
6 changed files with 37 additions and 72 deletions

View File

@ -588,7 +588,6 @@ LoadDLLfuncEx (IdnToUnicode, 20, kernel32, 1)
LoadDLLfunc (LocaleNameToLCID, 8, kernel32) LoadDLLfunc (LocaleNameToLCID, 8, kernel32)
LoadDLLfuncEx (PrefetchVirtualMemory, 16, kernel32, 1) LoadDLLfuncEx (PrefetchVirtualMemory, 16, kernel32, 1)
LoadDLLfunc (SetThreadGroupAffinity, 12, kernel32) LoadDLLfunc (SetThreadGroupAffinity, 12, kernel32)
LoadDLLfunc (SetThreadStackGuarantee, 4, kernel32)
/* ldap functions are cdecl! */ /* ldap functions are cdecl! */
#pragma push_macro ("mangle") #pragma push_macro ("mangle")

View File

@ -443,11 +443,9 @@ child_info_fork::alloc_stack ()
api_fatal ("fork: couldn't allocate new stack guard page %p, %E", api_fatal ("fork: couldn't allocate new stack guard page %p, %E",
stack_ptr); stack_ptr);
} }
/* On post-XP systems, set thread stack guarantee matching the /* Set thread stack guarantee matching the guardsize.
guardsize. Note that the guardsize is one page bigger than Note that the guardsize is one page bigger than the guarantee. */
the guarantee. */ if (real_guardsize > wincap.def_guard_page_size ())
if (wincap.has_set_thread_stack_guarantee ()
&& real_guardsize > wincap.def_guard_page_size ())
{ {
real_guardsize -= wincap.page_size (); real_guardsize -= wincap.page_size ();
SetThreadStackGuarantee (&real_guardsize); SetThreadStackGuarantee (&real_guardsize);

View File

@ -1581,9 +1581,8 @@ altstack_wrapper (int sig, siginfo_t *siginfo, ucontext_t *sigctx,
/* ...restore guard pages in original stack as if MSVCRT::_resetstkovlw /* ...restore guard pages in original stack as if MSVCRT::_resetstkovlw
has been called. has been called.
Compute size of guard pages. If SetThreadStackGuarantee isn't Compute size of guard pages. If SetThreadStackGuarantee returns 0,
supported, or if it returns 0, use the default guard page size. */ use the default guard page size. */
if (wincap.has_set_thread_stack_guarantee ())
SetThreadStackGuarantee (&guard_size); SetThreadStackGuarantee (&guard_size);
if (!guard_size) if (!guard_size)
guard_size = wincap.def_guard_page_size (); guard_size = wincap.def_guard_page_size ();

View File

@ -609,10 +609,9 @@ pthread_wrapper (PVOID arg)
The below assembler code will release the OS stack after switching to our The below assembler code will release the OS stack after switching to our
new stack. */ new stack. */
wrapper_arg.stackaddr = dealloc_addr; wrapper_arg.stackaddr = dealloc_addr;
/* On post-XP systems, set thread stack guarantee matching the guardsize. /* Set thread stack guarantee matching the guardsize.
Note that the guardsize is one page bigger than the guarantee. */ Note that the guardsize is one page bigger than the guarantee. */
if (wincap.has_set_thread_stack_guarantee () if (wrapper_arg.guardsize > wincap.def_guard_page_size ())
&& wrapper_arg.guardsize > wincap.def_guard_page_size ())
{ {
wrapper_arg.guardsize -= wincap.page_size (); wrapper_arg.guardsize -= wincap.page_size ();
SetThreadStackGuarantee (&wrapper_arg.guardsize); SetThreadStackGuarantee (&wrapper_arg.guardsize);
@ -877,30 +876,10 @@ CygwinCreateThread (LPTHREAD_START_ROUTINE thread_func, PVOID thread_arg,
#endif #endif
if (!real_stackaddr) if (!real_stackaddr)
return NULL; return NULL;
/* Set up committed region. We have two cases: */ /* Set up committed region. We set up the stack like the OS does,
if (!wincap.has_set_thread_stack_guarantee () with a reserved region, the guard pages, and a commited region.
&& real_guardsize != wincap.def_guard_page_size ()) We commit the stack commit size from the executable header, but
{ at least PTHREAD_STACK_MIN (64K). */
/* If guardsize is set to something other than the default guard page
size, and if we're running on Windows XP 32 bit, we commit the
entire stack, and, if guardsize is > 0, set up a guard page. */
real_stacklimit = (PBYTE) real_stackaddr + wincap.page_size ();
if (real_guardsize
&& !VirtualAlloc (real_stacklimit, real_guardsize, MEM_COMMIT,
PAGE_READWRITE | PAGE_GUARD))
goto err;
real_stacklimit += real_guardsize;
if (!VirtualAlloc (real_stacklimit, real_stacksize - real_guardsize
- wincap.page_size (),
MEM_COMMIT, PAGE_READWRITE))
goto err;
}
else
{
/* Otherwise we set up the stack like the OS does, with a reserved
region, the guard pages, and a commited region. We commit the
stack commit size from the executable header, but at least
PTHREAD_STACK_MIN (64K). */
static ULONG exe_commitsize; static ULONG exe_commitsize;
if (!exe_commitsize) if (!exe_commitsize)
@ -915,21 +894,20 @@ CygwinCreateThread (LPTHREAD_START_ROUTINE thread_func, PVOID thread_arg,
exe_commitsize = roundup2 (exe_commitsize, wincap.page_size ()); exe_commitsize = roundup2 (exe_commitsize, wincap.page_size ());
} }
ULONG commitsize = exe_commitsize; ULONG commitsize = exe_commitsize;
if (commitsize > real_stacksize - real_guardsize if (commitsize > real_stacksize - real_guardsize - wincap.page_size ())
- wincap.page_size ())
commitsize = real_stacksize - real_guardsize - wincap.page_size (); commitsize = real_stacksize - real_guardsize - wincap.page_size ();
else if (commitsize < PTHREAD_STACK_MIN) else if (commitsize < PTHREAD_STACK_MIN)
commitsize = PTHREAD_STACK_MIN; commitsize = PTHREAD_STACK_MIN;
real_stacklimit = (PBYTE) real_stackaddr + real_stacksize real_stacklimit = (PBYTE) real_stackaddr + real_stacksize
- commitsize - real_guardsize; - commitsize - real_guardsize;
if (!VirtualAlloc (real_stacklimit, real_guardsize, if (!VirtualAlloc (real_stacklimit, real_guardsize, MEM_COMMIT,
MEM_COMMIT, PAGE_READWRITE | PAGE_GUARD)) PAGE_READWRITE | PAGE_GUARD))
goto err; goto err;
real_stacklimit += real_guardsize; real_stacklimit += real_guardsize;
if (!VirtualAlloc (real_stacklimit, commitsize, MEM_COMMIT, if (!VirtualAlloc (real_stacklimit, commitsize, MEM_COMMIT,
PAGE_READWRITE)) PAGE_READWRITE))
goto err; goto err;
}
wrapper_arg->stackaddr = (PBYTE) real_stackaddr; wrapper_arg->stackaddr = (PBYTE) real_stackaddr;
wrapper_arg->stackbase = (PBYTE) real_stackaddr + real_stacksize; wrapper_arg->stackbase = (PBYTE) real_stackaddr + real_stacksize;
wrapper_arg->stacklimit = real_stacklimit; wrapper_arg->stacklimit = real_stacklimit;

View File

@ -29,7 +29,6 @@ wincaps wincap_xpsp2 __attribute__((section (".cygwin_dll_common"), shared)) = {
terminate_thread_frees_stack:false, terminate_thread_frees_stack:false,
has_precise_system_time:false, has_precise_system_time:false,
has_microsoft_accounts:false, has_microsoft_accounts:false,
has_set_thread_stack_guarantee:false,
has_broken_rtl_query_process_debug_information:false, has_broken_rtl_query_process_debug_information:false,
has_processor_groups:false, has_processor_groups:false,
has_broken_prefetchvm:false, has_broken_prefetchvm:false,
@ -49,7 +48,6 @@ wincaps wincap_2003 __attribute__((section (".cygwin_dll_common"), shared)) = {
terminate_thread_frees_stack:false, terminate_thread_frees_stack:false,
has_precise_system_time:false, has_precise_system_time:false,
has_microsoft_accounts:false, has_microsoft_accounts:false,
has_set_thread_stack_guarantee:true,
has_broken_rtl_query_process_debug_information:true, has_broken_rtl_query_process_debug_information:true,
has_processor_groups:false, has_processor_groups:false,
has_broken_prefetchvm:false, has_broken_prefetchvm:false,
@ -69,7 +67,6 @@ wincaps wincap_vista __attribute__((section (".cygwin_dll_common"), shared)) = {
terminate_thread_frees_stack:true, terminate_thread_frees_stack:true,
has_precise_system_time:false, has_precise_system_time:false,
has_microsoft_accounts:false, has_microsoft_accounts:false,
has_set_thread_stack_guarantee:true,
has_broken_rtl_query_process_debug_information:false, has_broken_rtl_query_process_debug_information:false,
has_processor_groups:false, has_processor_groups:false,
has_broken_prefetchvm:false, has_broken_prefetchvm:false,
@ -89,7 +86,6 @@ wincaps wincap_7 __attribute__((section (".cygwin_dll_common"), shared)) = {
terminate_thread_frees_stack:true, terminate_thread_frees_stack:true,
has_precise_system_time:false, has_precise_system_time:false,
has_microsoft_accounts:false, has_microsoft_accounts:false,
has_set_thread_stack_guarantee:true,
has_broken_rtl_query_process_debug_information:false, has_broken_rtl_query_process_debug_information:false,
has_processor_groups:true, has_processor_groups:true,
has_broken_prefetchvm:false, has_broken_prefetchvm:false,
@ -109,7 +105,6 @@ wincaps wincap_8 __attribute__((section (".cygwin_dll_common"), shared)) = {
terminate_thread_frees_stack:true, terminate_thread_frees_stack:true,
has_precise_system_time:true, has_precise_system_time:true,
has_microsoft_accounts:true, has_microsoft_accounts:true,
has_set_thread_stack_guarantee:true,
has_broken_rtl_query_process_debug_information:false, has_broken_rtl_query_process_debug_information:false,
has_processor_groups:true, has_processor_groups:true,
has_broken_prefetchvm:false, has_broken_prefetchvm:false,
@ -129,7 +124,6 @@ wincaps wincap_10 __attribute__((section (".cygwin_dll_common"), shared)) = {
terminate_thread_frees_stack:true, terminate_thread_frees_stack:true,
has_precise_system_time:true, has_precise_system_time:true,
has_microsoft_accounts:true, has_microsoft_accounts:true,
has_set_thread_stack_guarantee:true,
has_broken_rtl_query_process_debug_information:false, has_broken_rtl_query_process_debug_information:false,
has_processor_groups:true, has_processor_groups:true,
has_broken_prefetchvm:true, has_broken_prefetchvm:true,
@ -149,7 +143,6 @@ wincaps wincap_10_1511 __attribute__((section (".cygwin_dll_common"), shared)) =
terminate_thread_frees_stack:true, terminate_thread_frees_stack:true,
has_precise_system_time:true, has_precise_system_time:true,
has_microsoft_accounts:true, has_microsoft_accounts:true,
has_set_thread_stack_guarantee:true,
has_broken_rtl_query_process_debug_information:false, has_broken_rtl_query_process_debug_information:false,
has_processor_groups:true, has_processor_groups:true,
has_broken_prefetchvm:false, has_broken_prefetchvm:false,

View File

@ -22,7 +22,6 @@ struct wincaps
unsigned terminate_thread_frees_stack : 1; unsigned terminate_thread_frees_stack : 1;
unsigned has_precise_system_time : 1; unsigned has_precise_system_time : 1;
unsigned has_microsoft_accounts : 1; unsigned has_microsoft_accounts : 1;
unsigned has_set_thread_stack_guarantee : 1;
unsigned has_broken_rtl_query_process_debug_information : 1; unsigned has_broken_rtl_query_process_debug_information : 1;
unsigned has_processor_groups : 1; unsigned has_processor_groups : 1;
unsigned has_broken_prefetchvm : 1; unsigned has_broken_prefetchvm : 1;
@ -67,7 +66,6 @@ public:
bool IMPLEMENT (terminate_thread_frees_stack) bool IMPLEMENT (terminate_thread_frees_stack)
bool IMPLEMENT (has_precise_system_time) bool IMPLEMENT (has_precise_system_time)
bool IMPLEMENT (has_microsoft_accounts) bool IMPLEMENT (has_microsoft_accounts)
bool IMPLEMENT (has_set_thread_stack_guarantee)
bool IMPLEMENT (has_broken_rtl_query_process_debug_information) bool IMPLEMENT (has_broken_rtl_query_process_debug_information)
bool IMPLEMENT (has_processor_groups) bool IMPLEMENT (has_processor_groups)
bool IMPLEMENT (has_broken_prefetchvm) bool IMPLEMENT (has_broken_prefetchvm)