Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2013-03-29 21:00:36 +0400
committerCorinna Vinschen <corinna@vinschen.de>2013-03-29 21:00:36 +0400
commit4aa4632ad2c4fa5ee145fa7ffbdf45ba6cc45780 (patch)
tree8d575dc2d5c5c70376ec80435dd226a7ace10b30
parentbb93b7ab95e10ffdf17eeb6e0e055956b92603c3 (diff)
* cygthread.cc (cygthread::terminate_thread): Only try to free
thread stack on systems not freeing it by themselves. * wincap.h (wincaps::terminate_thread_frees_stack): New element. * wincap.cc: Implement above element throughout.
-rw-r--r--winsup/cygwin/ChangeLog7
-rw-r--r--winsup/cygwin/cygthread.cc23
-rw-r--r--winsup/cygwin/wincap.cc11
-rw-r--r--winsup/cygwin/wincap.h4
4 files changed, 33 insertions, 12 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 15c1b6798..7b19686ae 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,10 @@
+2013-03-29 Corinna Vinschen <corinna@vinschen.de>
+
+ * cygthread.cc (cygthread::terminate_thread): Only try to free
+ thread stack on systems not freeing it by themselves.
+ * wincap.h (wincaps::terminate_thread_frees_stack): New element.
+ * wincap.cc: Implement above element throughout.
+
2013-03-29 Christopher Faylor <me.cygwin2013@cgf.cx>
* pinfo.h (pinfo::status_exit): Rename from former static function in
diff --git a/winsup/cygwin/cygthread.cc b/winsup/cygwin/cygthread.cc
index 9e4ce62ac..325b7e879 100644
--- a/winsup/cygwin/cygthread.cc
+++ b/winsup/cygwin/cygthread.cc
@@ -1,7 +1,7 @@
/* cygthread.cc
Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009,
- 2010, 2011, 2012 Red Hat, Inc.
+ 2010, 2011, 2012, 2013 Red Hat, Inc.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
@@ -313,15 +313,18 @@ cygthread::terminate_thread ()
if (ev && !(terminated = !IsEventSignalled (ev)))
ResetEvent (ev);
- MEMORY_BASIC_INFORMATION m;
- memset (&m, 0, sizeof (m));
- VirtualQuery (stack_ptr, &m, sizeof m);
-
- if (!m.RegionSize)
- system_printf ("m.RegionSize 0? stack_ptr %p", stack_ptr);
- else if (!VirtualFree (m.AllocationBase, 0, MEM_RELEASE))
- debug_printf ("VirtualFree of allocation base %p<%p> failed, %E",
- stack_ptr, m.AllocationBase);
+ if (!wincap.terminate_thread_frees_stack ())
+ {
+ MEMORY_BASIC_INFORMATION m;
+ memset (&m, 0, sizeof (m));
+ VirtualQuery (stack_ptr, &m, sizeof m);
+
+ if (!m.RegionSize)
+ system_printf ("m.RegionSize 0? stack_ptr %p", stack_ptr);
+ else if (!VirtualFree (m.AllocationBase, 0, MEM_RELEASE))
+ debug_printf ("VirtualFree of allocation base %p<%p> failed, %E",
+ stack_ptr, m.AllocationBase);
+ }
if (is_freerange)
free (this);
diff --git a/winsup/cygwin/wincap.cc b/winsup/cygwin/wincap.cc
index 35fe996cf..30c4eb908 100644
--- a/winsup/cygwin/wincap.cc
+++ b/winsup/cygwin/wincap.cc
@@ -2,7 +2,7 @@
capability class to the appropriate values.
Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
- 2012 Red Hat, Inc.
+ 2012, 2013 Red Hat, Inc.
This file is part of Cygwin.
@@ -56,6 +56,7 @@ wincaps wincap_2000 __attribute__((section (".cygwin_dll_common"), shared)) = {
wow64_has_secondary_stack:false,
has_program_compatibility_assistant:false,
kernel_is_always_casesensitive:true,
+ terminate_thread_frees_stack:false,
};
wincaps wincap_2000sp4 __attribute__((section (".cygwin_dll_common"), shared)) = {
@@ -91,6 +92,7 @@ wincaps wincap_2000sp4 __attribute__((section (".cygwin_dll_common"), shared)) =
wow64_has_secondary_stack:false,
has_program_compatibility_assistant:false,
kernel_is_always_casesensitive:true,
+ terminate_thread_frees_stack:false,
};
wincaps wincap_xp __attribute__((section (".cygwin_dll_common"), shared)) = {
@@ -126,6 +128,7 @@ wincaps wincap_xp __attribute__((section (".cygwin_dll_common"), shared)) = {
wow64_has_secondary_stack:false,
has_program_compatibility_assistant:false,
kernel_is_always_casesensitive:false,
+ terminate_thread_frees_stack:false,
};
wincaps wincap_xpsp1 __attribute__((section (".cygwin_dll_common"), shared)) = {
@@ -161,6 +164,7 @@ wincaps wincap_xpsp1 __attribute__((section (".cygwin_dll_common"), shared)) = {
wow64_has_secondary_stack:false,
has_program_compatibility_assistant:false,
kernel_is_always_casesensitive:false,
+ terminate_thread_frees_stack:false,
};
wincaps wincap_xpsp2 __attribute__((section (".cygwin_dll_common"), shared)) = {
@@ -196,6 +200,7 @@ wincaps wincap_xpsp2 __attribute__((section (".cygwin_dll_common"), shared)) = {
wow64_has_secondary_stack:false,
has_program_compatibility_assistant:false,
kernel_is_always_casesensitive:false,
+ terminate_thread_frees_stack:false,
};
wincaps wincap_2003 __attribute__((section (".cygwin_dll_common"), shared)) = {
@@ -231,6 +236,7 @@ wincaps wincap_2003 __attribute__((section (".cygwin_dll_common"), shared)) = {
wow64_has_secondary_stack:true,
has_program_compatibility_assistant:false,
kernel_is_always_casesensitive:false,
+ terminate_thread_frees_stack:false,
};
wincaps wincap_vista __attribute__((section (".cygwin_dll_common"), shared)) = {
@@ -266,6 +272,7 @@ wincaps wincap_vista __attribute__((section (".cygwin_dll_common"), shared)) = {
wow64_has_secondary_stack:false,
has_program_compatibility_assistant:true,
kernel_is_always_casesensitive:false,
+ terminate_thread_frees_stack:true,
};
wincaps wincap_7 __attribute__((section (".cygwin_dll_common"), shared)) = {
@@ -301,6 +308,7 @@ wincaps wincap_7 __attribute__((section (".cygwin_dll_common"), shared)) = {
wow64_has_secondary_stack:false,
has_program_compatibility_assistant:true,
kernel_is_always_casesensitive:false,
+ terminate_thread_frees_stack:true,
};
wincaps wincap_8 __attribute__((section (".cygwin_dll_common"), shared)) = {
@@ -336,6 +344,7 @@ wincaps wincap_8 __attribute__((section (".cygwin_dll_common"), shared)) = {
wow64_has_secondary_stack:false,
has_program_compatibility_assistant:true,
kernel_is_always_casesensitive:false,
+ terminate_thread_frees_stack:true,
};
wincapc wincap __attribute__((section (".cygwin_dll_common"), shared));
diff --git a/winsup/cygwin/wincap.h b/winsup/cygwin/wincap.h
index dffe0cc4b..d3823e0c3 100644
--- a/winsup/cygwin/wincap.h
+++ b/winsup/cygwin/wincap.h
@@ -1,7 +1,7 @@
/* wincap.h: Header for OS capability class.
Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
- 2012 Red Hat, Inc.
+ 2012, 2013 Red Hat, Inc.
This file is part of Cygwin.
@@ -46,6 +46,7 @@ struct wincaps
unsigned wow64_has_secondary_stack : 1;
unsigned has_program_compatibility_assistant : 1;
unsigned kernel_is_always_casesensitive : 1;
+ unsigned terminate_thread_frees_stack : 1;
};
class wincapc
@@ -100,6 +101,7 @@ public:
bool IMPLEMENT (wow64_has_secondary_stack)
bool IMPLEMENT (has_program_compatibility_assistant)
bool IMPLEMENT (kernel_is_always_casesensitive)
+ bool IMPLEMENT (terminate_thread_frees_stack)
#undef IMPLEMENT
};