Use uint64_t and (uint64_t) 1 for 64-bit int
[platform/upstream/glibc.git] / sysdeps / nptl / internaltypes.h
1 /* Copyright (C) 2002-2015 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the 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    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <http://www.gnu.org/licenses/>.  */
18
19 #ifndef _INTERNALTYPES_H
20 #define _INTERNALTYPES_H        1
21
22 #include <stdint.h>
23 #include <atomic.h>
24 #include <endian.h>
25
26
27 struct pthread_attr
28 {
29   /* Scheduler parameters and priority.  */
30   struct sched_param schedparam;
31   int schedpolicy;
32   /* Various flags like detachstate, scope, etc.  */
33   int flags;
34   /* Size of guard area.  */
35   size_t guardsize;
36   /* Stack handling.  */
37   void *stackaddr;
38   size_t stacksize;
39   /* Affinity map.  */
40   cpu_set_t *cpuset;
41   size_t cpusetsize;
42 };
43
44 #define ATTR_FLAG_DETACHSTATE           0x0001
45 #define ATTR_FLAG_NOTINHERITSCHED       0x0002
46 #define ATTR_FLAG_SCOPEPROCESS          0x0004
47 #define ATTR_FLAG_STACKADDR             0x0008
48 #define ATTR_FLAG_OLDATTR               0x0010
49 #define ATTR_FLAG_SCHED_SET             0x0020
50 #define ATTR_FLAG_POLICY_SET            0x0040
51
52
53 /* Mutex attribute data structure.  */
54 struct pthread_mutexattr
55 {
56   /* Identifier for the kind of mutex.
57
58      Bit 31 is set if the mutex is to be shared between processes.
59
60      Bit 0 to 30 contain one of the PTHREAD_MUTEX_ values to identify
61      the type of the mutex.  */
62   int mutexkind;
63 };
64
65
66 /* Conditional variable attribute data structure.  */
67 struct pthread_condattr
68 {
69   /* Combination of values:
70
71      Bit 0  : flag whether conditional variable will be sharable between
72               processes.
73
74      Bit 1-7: clock ID.  */
75   int value;
76 };
77
78
79 /* The __NWAITERS field is used as a counter and to house the number
80    of bits for other purposes.  COND_CLOCK_BITS is the number
81    of bits needed to represent the ID of the clock.  COND_NWAITERS_SHIFT
82    is the number of bits reserved for other purposes like the clock.  */
83 #define COND_CLOCK_BITS         1
84 #define COND_NWAITERS_SHIFT     1
85
86
87 /* Read-write lock variable attribute data structure.  */
88 struct pthread_rwlockattr
89 {
90   int lockkind;
91   int pshared;
92 };
93
94
95 /* Barrier data structure.  */
96 struct pthread_barrier
97 {
98   unsigned int curr_event;
99   int lock;
100   unsigned int left;
101   unsigned int init_count;
102   int private;
103 };
104
105
106 /* Barrier variable attribute data structure.  */
107 struct pthread_barrierattr
108 {
109   int pshared;
110 };
111
112
113 /* Thread-local data handling.  */
114 struct pthread_key_struct
115 {
116   /* Sequence numbers.  Even numbers indicated vacant entries.  Note
117      that zero is even.  We use uintptr_t to not require padding on
118      32- and 64-bit machines.  On 64-bit machines it helps to avoid
119      wrapping, too.  */
120   uintptr_t seq;
121
122   /* Destructor for the data.  */
123   void (*destr) (void *);
124 };
125
126 /* Check whether an entry is unused.  */
127 #define KEY_UNUSED(p) (((p) & 1) == 0)
128 /* Check whether a key is usable.  We cannot reuse an allocated key if
129    the sequence counter would overflow after the next destroy call.
130    This would mean that we potentially free memory for a key with the
131    same sequence.  This is *very* unlikely to happen, A program would
132    have to create and destroy a key 2^31 times (on 32-bit platforms,
133    on 64-bit platforms that would be 2^63).  If it should happen we
134    simply don't use this specific key anymore.  */
135 #define KEY_USABLE(p) (((uintptr_t) (p)) < ((uintptr_t) ((p) + 2)))
136
137
138 /* Handling of read-write lock data.  */
139 // XXX For now there is only one flag.  Maybe more in future.
140 #define RWLOCK_RECURSIVE(rwlock) ((rwlock)->__data.__flags != 0)
141
142
143 /* Semaphore variable structure.  */
144 struct new_sem
145 {
146 #if __HAVE_64B_ATOMICS
147   /* The data field holds both value (in the least-significant 32 bytes) and
148      nwaiters.  */
149 # if __BYTE_ORDER == __LITTLE_ENDIAN
150 #  define SEM_VALUE_OFFSET 0
151 # elif __BYTE_ORDER == __BIG_ENDIAN
152 #  define SEM_VALUE_OFFSET 1
153 # else
154 # error Unsupported byte order.
155 # endif
156 # define SEM_NWAITERS_SHIFT 32
157 # define SEM_VALUE_MASK (~(unsigned int)0)
158   uint64_t data;
159   int private;
160   int pad;
161 #else
162 # define SEM_VALUE_SHIFT 1
163 # define SEM_NWAITERS_MASK ((unsigned int)1)
164   unsigned int value;
165   int private;
166   int pad;
167   unsigned int nwaiters;
168 #endif
169 };
170
171 struct old_sem
172 {
173   unsigned int value;
174 };
175
176
177 /* Compatibility type for old conditional variable interfaces.  */
178 typedef struct
179 {
180   pthread_cond_t *cond;
181 } pthread_cond_2_0_t;
182
183 #endif  /* internaltypes.h */