]> granicus.if.org Git - gc/commitdiff
2010-03-13 Ivan Maidanski <ivmai@mail.ru>
authorivmai <ivmai>
Sat, 13 Mar 2010 07:57:52 +0000 (07:57 +0000)
committerIvan Maidanski <ivmai@mail.ru>
Tue, 26 Jul 2011 17:06:53 +0000 (21:06 +0400)
* os_dep.c (GC_get_main_stack_base): Use pthread_getattr_np() and
pthread_attr_getstack() instead of GC_get_stack_base() (and check
returned stackaddr for NULL); output a warning on failure.

ChangeLog
os_dep.c

index 68db4abebc937898240bb7bbfa9abc1ba542c643..092c572c4a251b9a63eeb84e8166fce18e49bea0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2010-03-13  Ivan Maidanski <ivmai@mail.ru>
+
+       * os_dep.c (GC_get_main_stack_base): Use pthread_getattr_np() and
+       pthread_attr_getstack() instead of GC_get_stack_base() (and check
+       returned stackaddr for NULL); output a warning on failure.
+
 2010-03-12  Ivan Maidanski <ivmai@mail.ru>
 
        * alloc.c (GC_start_call_back): Replace the definition type to
index c84e2ff5c6a040c8c9d38798061bd534a6051c2b..e8d50547aa10f4c7505a481abe00f49e65ede2a9 100644 (file)
--- a/os_dep.c
+++ b/os_dep.c
@@ -1165,9 +1165,22 @@ ptr_t GC_get_main_stack_base(void)
 #       ifdef LINUX_STACKBOTTOM
 #          if defined(THREADS) && defined(USE_GET_STACKBASE_FOR_MAIN)
              {
-               struct GC_stack_base sb;
-               if (GC_get_stack_base(&sb) == GC_SUCCESS)
-                 return (ptr_t)sb.mem_base;
+               pthread_attr_t attr;
+               void *stackaddr;
+               size_t size;
+               if (pthread_getattr_np(pthread_self(), &attr) == 0) {
+                 if (pthread_attr_getstack(&attr, &stackaddr, &size) == 0
+                     && stackaddr != NULL) {
+                   pthread_attr_destroy(&attr);
+#                  ifdef STACK_GROWS_DOWN
+                     stackaddr = (char *)stackaddr + size;
+#                  endif
+                   return (ptr_t)stackaddr;
+                 }
+                 pthread_attr_destroy(&attr);
+               }
+               WARN("pthread_getattr_np/pthread_attr_getstack failed"
+                    " for main thread\n", 0);
              }
 #          endif
            result = GC_linux_stack_base();