Implement pthread_getattr_np
authorDavid Bartley <dtbartle@maltodextrin.csclub.uwaterloo.ca>
Sat, 23 Aug 2008 09:55:51 +0000 (09:55 +0000)
committerDavid Bartley <dtbartle@maltodextrin.csclub.uwaterloo.ca>
Sat, 23 Aug 2008 09:55:51 +0000 (09:55 +0000)
nptl/init.c
nptl/pthread_getattr_np.c
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/pthread_getattr_np.c [deleted file]
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/pthreaddef.h

index fa0c313..72b3e7e 100644 (file)
@@ -131,6 +131,11 @@ static const struct pthread_functions pthread_functions =
 #endif
 
 
+#ifdef PLATFORM_STATIC_DECLS
+PLATFORM_STATIC_DECLS
+#endif
+
+
 /* For asynchronous cancellation we use a signal.  This is the handler.  */
 static void
 sigcancel_handler (int sig, siginfo_t *si, void *ctx)
index 9c25caf..8406312 100644 (file)
@@ -25,7 +25,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <sys/resource.h>
-#include "pthreadP.h"
+#include <pthreadP.h>
 #include <lowlevellock.h>
 #include <ldsodefs.h>
 
@@ -35,7 +35,12 @@ pthread_getattr_np (thread_id, attr)
      pthread_t thread_id;
      pthread_attr_t *attr;
 {
+#ifndef PTHREAD_T_IS_TID
   struct pthread *thread = (struct pthread *) thread_id;
+#else
+  struct pthread *thread = __find_in_stack_list (thread_id);
+#endif
+
   struct pthread_attr *iattr = (struct pthread_attr *) attr;
   int ret = 0;
 
@@ -65,6 +70,9 @@ pthread_getattr_np (thread_id, attr)
     }
   else
     {
+#ifdef GET_MAIN_STACK_INFO
+      ret = GET_MAIN_STACK_INFO (&iattr->stackaddr, &iattr->stacksize);
+#else
       /* No stack information available.  This must be for the initial
         thread.  Get the info in some magical way.  */
       assert (abs (thread->pid) == thread->tid);
@@ -129,6 +137,7 @@ pthread_getattr_np (thread_id, attr)
 
          fclose (fp);
        }
+#endif
     }
 
   iattr->flags |= ATTR_FLAG_STACKADDR;
diff --git a/nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/pthread_getattr_np.c b/nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/pthread_getattr_np.c
deleted file mode 100644 (file)
index 1dd2d81..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Copyright (C) 2002, 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <errno.h>
-#include <pthreadP.h>
-
-int
-pthread_getattr_np (thread_id, attr)
-     pthread_t thread_id;
-     pthread_attr_t *attr;
-{
-  return ENOSYS;
-}
-
-stub_warning (pthread_getattr_np)
-#include <stub-tag.h>
index 4ce180e..47e52b5 100644 (file)
 
 /* Register atfork handlers to protect signal_lock.  */
 extern void sigaction_atfork (void);
-#define PLATFORM_PTHREAD_INIT               \
-    sigaction_atfork ();                    \
-    THREAD_SETMEM (pd, main_thread, 1);
+
+#include <ucontext.h>
+#define PLATFORM_PTHREAD_INIT                   \
+    sigaction_atfork ();                        \
+    THREAD_SETMEM (pd, main_thread, 1);         \
+    ucontext_t _ctx;                            \
+    if (getcontext (&_ctx) == 0)                \
+      {                                         \
+        main_stackaddr = _ctx.uc_stack.ss_sp;   \
+        main_stacksize = _ctx.uc_stack.ss_size; \
+      }
 
 /* Additional descr fields.  */
 # define PLATFORM_DESCR_FIELDS              \
     int sigpipe_disabled;                   \
     int main_thread;
 
+/* Static variables.  */
+#define PLATFORM_STATIC_DECLS   \
+    void *main_stackaddr;       \
+    size_t main_stacksize;
+extern void *main_stackaddr;
+extern size_t main_stacksize;
+
+/* We can get the main thread's stack via getcontext (see above).  */
+#define GET_MAIN_STACK_INFO(stackaddr, stacksize)       \
+    ({*stackaddr = main_stackaddr + main_stacksize;     \
+      *stacksize = main_stacksize;                      \
+      0;})
+
 /* Use tid as pthread_t (instead of descr).  */
 #define PTHREAD_T_IS_TID