diff options
author | ivmai <ivmai> | 2010-03-13 07:57:52 +0000 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2011-07-26 21:06:53 +0400 |
commit | 7896408d4149347588ed0e36319b53bcea70115b (patch) | |
tree | 64db3b890e2d4b929538bbe1a4574ad2e93511b7 /os_dep.c | |
parent | 86a4ee915f3dcd4241882e4ff9b8564b56714451 (diff) | |
download | bdwgc-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.c | 19 |
1 files changed, 16 insertions, 3 deletions
@@ -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(); |