6929519f11ec66e52d943e3b13cb37b2d7557892
[kopensolaris-gnu/glibc.git] / nptl / sysdeps / unix / sysv / solaris2 / kopensolaris-gnu / internaltypes.h
1 /* Copyright (C) 2002, 2003, 2004, 2007, 2008 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
4    OpenSolaris bits contributed by David Bartley
5     <dtbartle@csclub.uwaterloo.ca>, 2008.
6
7    The GNU C Library is free software; you can redistribute it and/or
8    modify it under the terms of the GNU Lesser General Public
9    License as published by the Free Software Foundation; either
10    version 2.1 of the License, or (at your option) any later version.
11
12    The GNU C Library is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15    Lesser General Public License for more details.
16
17    You should have received a copy of the GNU Lesser General Public
18    License along with the GNU C Library; if not, write to the Free
19    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20    02111-1307 USA.  */
21
22 #ifndef _INTERNALTYPES_H
23 #define _INTERNALTYPES_H        1
24
25 #include <stdint.h>
26 #include <time.h>
27 #include <stdbool.h>
28
29
30 struct pthread_attr
31 {
32   /* Scheduler parameters and priority.  */
33   struct sched_param schedparam;
34   int schedpolicy;
35   /* Various flags like detachstate, scope, etc.  */
36   int flags;
37   /* Size of guard area.  */
38   size_t guardsize;
39   /* Stack handling.  */
40   void *stackaddr;
41   size_t stacksize;
42   /* Affinity map.  */
43   cpu_set_t *cpuset;
44   size_t cpusetsize;
45 };
46
47 #define ATTR_FLAG_DETACHSTATE           0x0001
48 #define ATTR_FLAG_NOTINHERITSCHED       0x0002
49 #define ATTR_FLAG_SCOPEPROCESS          0x0004
50 #define ATTR_FLAG_STACKADDR             0x0008
51 #define ATTR_FLAG_OLDATTR               0x0010
52 #define ATTR_FLAG_SCHED_SET             0x0020
53 #define ATTR_FLAG_POLICY_SET            0x0040
54 #define ATTR_FLAG_DAEMON                0x0080
55 #define ATTR_FLAG_SUSPENDED             0x0100
56
57
58 /* Mutex attribute data structure.  */
59 struct pthread_mutexattr
60 {
61   /* Identifier for the kind of mutex.
62
63      Bit 31 is set if the mutex is to be shared between processes.
64
65      Bit 0 to 30 contain one of the PTHREAD_MUTEX_ values to identify
66      the type of the mutex.  */
67   int mutexkind;
68 };
69
70
71 /* Conditional variable attribute data structure.  */
72 struct pthread_condattr
73 {
74   /* Combination of values:
75
76      Bit 0  : flag whether coditional variable will be shareable between
77               processes.
78
79      Bit 1-7: clock ID.  */
80   int value;
81 };
82
83
84 /* The __NWAITERS field is used as a counter and to house the number
85    of bits for other purposes.  COND_CLOCK_BITS is the number
86    of bits needed to represent the ID of the clock.  COND_NWAITERS_SHIFT
87    is the number of bits reserved for other purposes like the clock.  */
88 #define COND_CLOCK_BITS         1
89 #define COND_NWAITERS_SHIFT     1
90
91
92 /* Read-write lock variable attribute data structure.  */
93 struct pthread_rwlockattr
94 {
95   int lockkind;
96   int pshared;
97 };
98
99 #define BARRIER_EXITING         0x01
100
101 /* Barrier data structure.  */
102 struct pthread_barrier
103 {
104   pthread_mutex_t mutex;
105   pthread_cond_t cond;
106   unsigned int curr_event;
107   unsigned int left;
108   unsigned int init_count;
109   unsigned int flag;
110 };
111
112
113 /* Barrier variable attribute data structure.  */
114 struct pthread_barrierattr
115 {
116   int pshared;
117 };
118
119
120 /* Thread-local data handling.  */
121 struct pthread_key_struct
122 {
123   /* Sequence numbers.  Even numbers indicated vacant entries.  Note
124      that zero is even.  We use uintptr_t to not require padding on
125      32- and 64-bit machines.  On 64-bit machines it helps to avoid
126      wrapping, too.  */
127   uintptr_t seq;
128
129   /* Destructor for the data.  */
130   void (*destr) (void *);
131 };
132
133 /* Check whether an entry is unused.  */
134 #define KEY_UNUSED(p) (((p) & 1) == 0)
135 /* Check whether a key is usable.  We cannot reuse an allocated key if
136    the sequence counter would overflow after the next destroy call.
137    This would mean that we potentially free memory for a key with the
138    same sequence.  This is *very* unlikely to happen, A program would
139    have to create and destroy a key 2^31 times (on 32-bit platforms,
140    on 64-bit platforms that would be 2^63).  If it should happen we
141    simply don't use this specific key anymore.  */
142 #define KEY_USABLE(p) (((uintptr_t) (p)) < ((uintptr_t) ((p) + 2)))
143
144
145 /* Handling of read-write lock data.  */
146 // XXX For now there is only one flag.  Maybe more in future.
147 //#define RWLOCK_RECURSIVE(rwlock) ((rwlock)->__data.__flags != 0)
148
149
150 /* Compatibility type for old conditional variable interfaces.  */
151 typedef struct
152 {
153   pthread_cond_t *cond;
154 } pthread_cond_2_0_t;
155
156 #endif  /* internaltypes.h */