]> sourceware.org Git - newlib-cygwin.git/commitdiff
* cygthread.cc (cygthread::terminate_thread): Only try to free
authorCorinna Vinschen <corinna@vinschen.de>
Fri, 29 Mar 2013 17:00:36 +0000 (17:00 +0000)
committerCorinna Vinschen <corinna@vinschen.de>
Fri, 29 Mar 2013 17:00:36 +0000 (17:00 +0000)
thread stack on systems not freeing it by themselves.
* wincap.h (wincaps::terminate_thread_frees_stack): New element.
* wincap.cc: Implement above element throughout.

winsup/cygwin/ChangeLog
winsup/cygwin/cygthread.cc
winsup/cygwin/wincap.cc
winsup/cygwin/wincap.h

index 15c1b6798760093ecfe2326e47e27bb397b58d5d..7b19686ae892541a0bec8f5de29435232f4f2742 100644 (file)
@@ -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
index 9e4ce62ac211e0d3c9063b360eb262a7f5f890bd..325b7e87961b0201aab1c84feeefc475e0d20ec3 100644 (file)
@@ -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);
index 35fe996cfc50876f3243e7fc293b4fc1f56c19b0..30c4eb90833dcdf79d1231345a3497cca149c0d4 100644 (file)
@@ -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));
index dffe0cc4b378480825c1a34bc9627d43b60fd2bb..d3823e0c3e1225f4e1dc2ff3ae834f16e96900a2 100644 (file)
@@ -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
 };
This page took 0.036294 seconds and 5 git commands to generate.