Initial revision
[kopensolaris-gnu/glibc.git] / hurd / hurd / threadvar.h
1 /* Internal per-thread variables for the Hurd.
2 Copyright (C) 1994 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public License as
7 published by the Free Software Foundation; either version 2 of the
8 License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public
16 License along with the GNU C Library; see the file COPYING.LIB.  If
17 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
18 Cambridge, MA 02139, USA.  */
19
20 #ifndef _HURD_PTV_H
21 #define _HURD_PTV_H
22
23 /* The per-thread variables are found by ANDing this mask
24    with the value of the stack pointer and then adding this offset.
25
26    In the multi-threaded case, cthreads initialization sets
27    __hurd_ptv_stack_mask to ~(cthread_stack_size - 1), a mask which finds
28    the base of the fixed-size cthreads stack; and __hurd_ptv_stack_offset
29    to a small offset that skips the data cthreads itself maintains at the
30    base of each thread's stack.
31
32    In the single-threaded case, __hurd_ptv_stack_mask is zero, so the stack
33    pointer is ignored; and __hurd_ptv_stack_offset gives the address of a
34    small allocated region which contains the variables for the single
35    thread.  */
36    
37 extern unsigned long int __hurd_ptv_stack_mask;
38 extern unsigned long int __hurd_ptv_stack_offset;
39
40 /* At the location described by the two variables above,
41    there are __hurd_ptv_max `unsigned long int's of per-thread data.  */
42 extern unsigned int __hurd_ptv_max;
43
44 /* These values are the indices for the standard per-thread variables.  */
45 enum __hurd_ptv_index
46   {
47     _HURD_PTV_ERRNO,            /* `errno' value for this thread.  */
48     _HURD_PTV_SIGSTATE,         /* This thread's `struct hurd_sigstate'.  */
49     _HURD_PTV_DYNAMIC_USER,     /* Dynamically-assigned user variables. */
50     _HURD_PTV_MAX               /* Default value for __hurd_ptv_max.  */
51   };
52
53
54 #ifndef _EXTERN_INLINE
55 #define _EXTERN_INLINE extern __inline
56 #endif
57
58 #include <machine-sp.h>         /* Define __thread_stack_pointer.  */
59
60 /* Return the location of the current thread's value for the
61    per-thread variable with index INDEX.  */
62
63 _EXTERN_INLINE unsigned long int *
64 __hurd_ptv_location (enum __hurd_ptv_index __index)
65 {
66   unsigned long int __stack = (unsigned long int) __thread_stack_pointer ();
67   __stack &= __hurd_ptv_stack_mask;
68   __stack += __hurd_ptv_stack_offset;
69   return &((unsigned long int *) __stack)[__index];
70 }
71
72 /* Return the current thread's location for `errno'.
73    The syntax of this function allows redeclarations like `int errno'.  */
74 _EXTERN_INLINE int *
75 __hurd_errno_location (void)
76 {
77   return (int *) __hurd_ptv_location (_HURD_PTV_ERRNO);
78 }
79
80 /* XXX to go in errno.h after #include <hurd/ptv.h>: */
81 #define errno   (*__hurd_errno_location ())
82
83
84 #endif  /* hurd/ptv.h */