summaryrefslogtreecommitdiff
path: root/os_dep.c
diff options
context:
space:
mode:
authorivmai <ivmai>2010-03-13 07:57:52 +0000
committerIvan Maidanski <ivmai@mail.ru>2011-07-26 21:06:53 +0400
commit7896408d4149347588ed0e36319b53bcea70115b (patch)
tree64db3b890e2d4b929538bbe1a4574ad2e93511b7 /os_dep.c
parent86a4ee915f3dcd4241882e4ff9b8564b56714451 (diff)
downloadbdwgc-7896408d4149347588ed0e36319b53bcea70115b.tar.gz
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.
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();