summaryrefslogtreecommitdiff
path: root/os_dep.c
diff options
context:
space:
mode:
Diffstat (limited to 'os_dep.c')
-rw-r--r--os_dep.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/os_dep.c b/os_dep.c
index c84e2ff5..e8d50547 100644
--- 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();