(enum __hurd_threadvar_index):
[kopensolaris-gnu/glibc.git] / hurd / hurd / threadvar.h
index 7aca296..b10efe9 100644 (file)
@@ -1,21 +1,21 @@
 /* Internal per-thread variables for the Hurd.
-Copyright (C) 1994 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+   Copyright (C) 1994, 1995, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 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
-Library General Public License for more details.
+   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
+   Library General Public License for more details.
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA.  */
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #ifndef _HURD_THREADVAR_H
 #define        _HURD_THREADVAR_H
@@ -33,7 +33,7 @@ Cambridge, MA 02139, USA.  */
    stack pointer is ignored; and __hurd_threadvar_stack_offset gives the
    address of a small allocated region which contains the variables for the
    single thread.  */
-   
+
 extern unsigned long int __hurd_threadvar_stack_mask;
 extern unsigned long int __hurd_threadvar_stack_offset;
 
@@ -60,6 +60,7 @@ enum __hurd_threadvar_index
     _HURD_THREADVAR_ERRNO,     /* `errno' value for this thread.  */
     _HURD_THREADVAR_SIGSTATE,  /* This thread's `struct hurd_sigstate'.  */
     _HURD_THREADVAR_DYNAMIC_USER, /* Dynamically-assigned user variables. */
+    _HURD_THREADVAR_MALLOC,    /* For use of malloc. */
     _HURD_THREADVAR_MAX                /* Default value for __hurd_threadvar_max.  */
   };
 
@@ -68,15 +69,14 @@ enum __hurd_threadvar_index
 #define _EXTERN_INLINE extern __inline
 #endif
 
-#include <machine-sp.h>                /* Define __thread_stack_pointer.  */
-
-/* Return the location of the current thread's value for the
-   per-thread variable with index INDEX.  */
+/* Return the location of the value for the per-thread variable with index
+   INDEX used by the thread whose stack pointer is SP.  */
 
 _EXTERN_INLINE unsigned long int *
-__hurd_threadvar_location (enum __hurd_threadvar_index __index)
+__hurd_threadvar_location_from_sp (enum __hurd_threadvar_index __index,
+                                  void *__sp)
 {
-  unsigned long int __stack = (unsigned long int) __thread_stack_pointer ();
+  unsigned long int __stack = (unsigned long int) __sp;
   return &((__stack >= __hurd_sigthread_stack_base &&
            __stack < __hurd_sigthread_stack_end)
           ? __hurd_sigthread_variables
@@ -84,13 +84,31 @@ __hurd_threadvar_location (enum __hurd_threadvar_index __index)
                                    __hurd_threadvar_stack_offset))[__index];
 }
 
+#include <machine-sp.h>                /* Define __thread_stack_pointer.  */
+
+/* Return the location of the current thread's value for the
+   per-thread variable with index INDEX.  */
+
+extern unsigned long int *
+__hurd_threadvar_location (enum __hurd_threadvar_index __index)
+     /* This declaration tells the compiler that the value is constant
+       given the same argument.  We assume this won't be called twice from
+       the same stack frame by different threads.  */
+     __attribute__ ((__const__));
+
+_EXTERN_INLINE unsigned long int *
+__hurd_threadvar_location (enum __hurd_threadvar_index __index)
+{
+  return __hurd_threadvar_location_from_sp (__index,
+                                           __thread_stack_pointer ());
+}
 
 /* Return the current thread's location for `errno'.
    The syntax of this function allows redeclarations like `int errno'.  */
-_EXTERN_INLINE __volatile int *
+_EXTERN_INLINE int *
 __hurd_errno_location (void)
 {
-  return (__volatile int *) __hurd_threadvar_location (_HURD_THREADVAR_ERRNO);
+  return (int *) __hurd_threadvar_location (_HURD_THREADVAR_ERRNO);
 }