2002-08-02 Roland McGrath <roland@redhat.com>
[kopensolaris-gnu/glibc.git] / linuxthreads / attr.c
index b6b1d9c..8b7e8ce 100644 (file)
@@ -22,7 +22,6 @@
 #include "pthread.h"
 #include "internals.h"
 #include <shlib-compat.h>
-#include <stackinfo.h>
 
 int __pthread_attr_init_2_1(pthread_attr_t *attr)
 {
@@ -283,21 +282,39 @@ int pthread_getattr_np (pthread_t thread, pthread_attr_t *attr)
 
   attr->__inheritsched = descr->p_inheritsched;
   attr->__scope = PTHREAD_SCOPE_SYSTEM;
+#ifdef _STACK_GROWS_DOWN
+# ifdef USE_TLS
+  attr->__stacksize = descr->p_stackaddr - (char *)descr->p_guardaddr
+                     - descr->p_guardsize;
+# else
   attr->__stacksize = (char *)(descr + 1) - (char *)descr->p_guardaddr
                      - descr->p_guardsize;
+# endif
+#else
+# ifdef USE_TLS
+  attr->__stacksize = (char *)descr->p_guardaddr - descr->p_stackaddr;
+# else
+  attr->__stacksize = (char *)descr->p_guardaddr - (char *)descr;
+# endif
+#endif
   attr->__guardsize = descr->p_guardsize;
   attr->__stackaddr_set = descr->p_userstack;
 #ifdef NEED_SEPARATE_REGISTER_STACK
-  attr->__stacksize *= 2;
+  if (descr->p_userstack == 0)
+    attr->__stacksize *= 2;
   /* XXX This is awkward.  The guard pages are in the middle of the
      two stacks.  We must count the guard size in the stack size since
      otherwise the range of the stack area cannot be computed.  */
   attr->__stacksize += attr->__guardsize;
 #endif
-#ifndef _STACK_GROWS_UP
-  attr->__stackaddr = (char *)(descr + 1);
+#ifdef USE_TLS
+  attr->__stackaddr = descr->p_stackaddr;
 #else
-#error __stackaddr not handled
+# ifndef _STACK_GROWS_UP
+  attr->__stackaddr = (char *)(descr + 1);
+# else
+  attr->__stackaddr = (char *)descr;
+# endif
 #endif
 
   return 0;