+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
# 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();