2 * Copyright 2004-2010 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
6 * Erik Jaesler (erik@cgsoftware.com)
8 #ifndef _SUPPORT_DEFS_H
9 #define _SUPPORT_DEFS_H
16 #include <sys/types.h>
19 /* fixed-size integer types */
20 typedef __haiku_int8 int8
;
21 typedef __haiku_uint8 uint8
;
22 typedef __haiku_int16 int16
;
23 typedef __haiku_uint16 uint16
;
24 typedef __haiku_int32 int32
;
25 typedef __haiku_uint32 uint32
;
26 typedef __haiku_int64 int64
;
27 typedef __haiku_uint64 uint64
;
30 typedef volatile int8 vint8
;
31 typedef volatile uint8 vuint8
;
32 typedef volatile int16 vint16
;
33 typedef volatile uint16 vuint16
;
34 typedef volatile int32 vint32
;
35 typedef volatile uint32 vuint32
;
36 typedef volatile int64 vint64
;
37 typedef volatile uint64 vuint64
;
39 typedef volatile long vlong
;
40 typedef volatile int vint
;
41 typedef volatile short vshort
;
42 typedef volatile char vchar
;
44 typedef volatile unsigned long vulong
;
45 typedef volatile unsigned int vuint
;
46 typedef volatile unsigned short vushort
;
47 typedef volatile unsigned char vuchar
;
49 typedef unsigned char uchar
;
50 typedef unsigned short unichar
;
52 /* descriptive types */
53 typedef int32 status_t
;
54 typedef int64 bigtime_t
;
55 typedef int64 nanotime_t
;
56 typedef uint32 type_code
;
57 typedef uint32 perform_code
;
59 typedef __haiku_phys_addr_t phys_addr_t
;
60 typedef phys_addr_t phys_size_t
;
62 typedef __haiku_generic_addr_t generic_addr_t
;
63 typedef generic_addr_t generic_size_t
;
66 /* printf()/scanf() format strings for [u]int* types */
71 #define B_PRId32 __HAIKU_PRI_PREFIX_32 "d"
72 #define B_PRIi32 __HAIKU_PRI_PREFIX_32 "i"
73 #define B_PRId64 __HAIKU_PRI_PREFIX_64 "d"
74 #define B_PRIi64 __HAIKU_PRI_PREFIX_64 "i"
83 #define B_PRIu32 __HAIKU_PRI_PREFIX_32 "u"
84 #define B_PRIo32 __HAIKU_PRI_PREFIX_32 "o"
85 #define B_PRIx32 __HAIKU_PRI_PREFIX_32 "x"
86 #define B_PRIX32 __HAIKU_PRI_PREFIX_32 "X"
87 #define B_PRIu64 __HAIKU_PRI_PREFIX_64 "u"
88 #define B_PRIo64 __HAIKU_PRI_PREFIX_64 "o"
89 #define B_PRIx64 __HAIKU_PRI_PREFIX_64 "x"
90 #define B_PRIX64 __HAIKU_PRI_PREFIX_64 "X"
96 #define B_SCNd32 __HAIKU_PRI_PREFIX_32 "d"
97 #define B_SCNi32 __HAIKU_PRI_PREFIX_32 "i"
98 #define B_SCNd64 __HAIKU_PRI_PREFIX_64 "d"
99 #define B_SCNi64 __HAIKU_PRI_PREFIX_64 "i"
100 #define B_SCNu8 "hhu"
101 #define B_SCNo8 "hho"
102 #define B_SCNx8 "hhx"
103 #define B_SCNu16 "hu"
104 #define B_SCNo16 "ho"
105 #define B_SCNx16 "hx"
106 #define B_SCNu32 __HAIKU_PRI_PREFIX_32 "u"
107 #define B_SCNo32 __HAIKU_PRI_PREFIX_32 "o"
108 #define B_SCNx32 __HAIKU_PRI_PREFIX_32 "x"
109 #define B_SCNu64 __HAIKU_PRI_PREFIX_64 "u"
110 #define B_SCNo64 __HAIKU_PRI_PREFIX_64 "o"
111 #define B_SCNx64 __HAIKU_PRI_PREFIX_64 "x"
113 /* printf()/scanf() format strings for some standard types */
115 #define B_PRIuSIZE __HAIKU_PRI_PREFIX_ADDR "u"
116 #define B_PRIoSIZE __HAIKU_PRI_PREFIX_ADDR "o"
117 #define B_PRIxSIZE __HAIKU_PRI_PREFIX_ADDR "x"
118 #define B_PRIXSIZE __HAIKU_PRI_PREFIX_ADDR "X"
120 #define B_SCNuSIZE __HAIKU_PRI_PREFIX_ADDR "u"
121 #define B_SCNoSIZE __HAIKU_PRI_PREFIX_ADDR "o"
122 #define B_SCNxSIZE __HAIKU_PRI_PREFIX_ADDR "x"
125 #define B_PRIdSSIZE __HAIKU_PRI_PREFIX_ADDR "d"
126 #define B_PRIiSSIZE __HAIKU_PRI_PREFIX_ADDR "i"
128 #define B_SCNdSSIZE __HAIKU_PRI_PREFIX_ADDR "d"
129 #define B_SCNiSSIZE __HAIKU_PRI_PREFIX_ADDR "i"
132 #define B_PRIuADDR __HAIKU_PRI_PREFIX_ADDR "u"
133 #define B_PRIoADDR __HAIKU_PRI_PREFIX_ADDR "o"
134 #define B_PRIxADDR __HAIKU_PRI_PREFIX_ADDR "x"
135 #define B_PRIXADDR __HAIKU_PRI_PREFIX_ADDR "X"
137 #define B_SCNuADDR __HAIKU_PRI_PREFIX_ADDR "u"
138 #define B_SCNoADDR __HAIKU_PRI_PREFIX_ADDR "o"
139 #define B_SCNxADDR __HAIKU_PRI_PREFIX_ADDR "x"
142 #define B_PRIuPHYSADDR __HAIKU_PRI_PREFIX_PHYS_ADDR "u"
143 #define B_PRIoPHYSADDR __HAIKU_PRI_PREFIX_PHYS_ADDR "o"
144 #define B_PRIxPHYSADDR __HAIKU_PRI_PREFIX_PHYS_ADDR "x"
145 #define B_PRIXPHYSADDR __HAIKU_PRI_PREFIX_PHYS_ADDR "X"
147 #define B_SCNuPHYSADDR __HAIKU_PRI_PREFIX_PHYS_ADDR "u"
148 #define B_SCNoPHYSADDR __HAIKU_PRI_PREFIX_PHYS_ADDR "o"
149 #define B_SCNxPHYSADDR __HAIKU_PRI_PREFIX_PHYS_ADDR "x"
152 #define B_PRIuGENADDR __HAIKU_PRI_PREFIX_GENERIC_ADDR "u"
153 #define B_PRIoGENADDR __HAIKU_PRI_PREFIX_GENERIC_ADDR "o"
154 #define B_PRIxGENADDR __HAIKU_PRI_PREFIX_GENERIC_ADDR "x"
155 #define B_PRIXGENADDR __HAIKU_PRI_PREFIX_GENERIC_ADDR "X"
157 #define B_SCNuGENADDR __HAIKU_PRI_PREFIX_GENERIC_ADDR "u"
158 #define B_SCNoGENADDR __HAIKU_PRI_PREFIX_GENERIC_ADDR "o"
159 #define B_SCNxGENADDR __HAIKU_PRI_PREFIX_GENERIC_ADDR "x"
162 #define B_PRIdOFF B_PRId64
163 #define B_PRIiOFF B_PRIi64
164 #define B_PRIxOFF B_PRIx64
166 #define B_SCNdOFF B_SCNd64
167 #define B_SCNiOFF B_SCNi64
168 #define B_SCNxOFF B_SCNx64
171 #define B_PRIdDEV B_PRId32
172 #define B_PRIiDEV B_PRIi32
175 #define B_PRIdINO B_PRId64
176 #define B_PRIiINO B_PRIi64
179 #if defined(__i386__) && !defined(__x86_64__)
180 # define B_PRIdTIME B_PRId32
181 # define B_PRIiTIME B_PRIi32
183 # define B_PRIdTIME B_PRId64
184 # define B_PRIiTIME B_PRIi64
188 #define B_PRIdBIGTIME B_PRId64
189 #define B_PRIiBIGTIME B_PRIi64
192 /* Printed width of a pointer with the %p format (minus 0x prefix). */
193 #ifdef B_HAIKU_64_BIT
194 # define B_PRINTF_POINTER_WIDTH 16
196 # define B_PRINTF_POINTER_WIDTH 8
200 /* Empty string ("") */
202 extern const char *B_EMPTY_STRING
;
206 /* min and max comparisons */
209 # define min(a,b) ((a)>(b)?(b):(a))
212 # define max(a,b) ((a)>(b)?(a):(b))
216 /* min() and max() are functions in C++ */
217 #define min_c(a,b) ((a)>(b)?(b):(a))
218 #define max_c(a,b) ((a)>(b)?(a):(b))
223 # include <stdbool.h>
236 extern void* get_stack_frame(void);
242 /* Count items in an array, count_of is a common define */
243 #define B_COUNT_OF(a) (sizeof(a) / sizeof(a[0]))
245 /* Obsolete or discouraged API */
247 /* use 'true' and 'false' */
256 /* Use the built-in atomic functions, if requested and available. */
258 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7) || defined(__clang__)
261 static __inline__
void
262 atomic_set(int32
* value
, int32 newValue
)
264 __atomic_store_n(value
, newValue
, __ATOMIC_RELEASE
);
268 static __inline__ int32
269 atomic_get_and_set(int32
* value
, int32 newValue
)
271 return __atomic_exchange_n(value
, newValue
, __ATOMIC_SEQ_CST
);
275 static __inline__ int32
276 atomic_test_and_set(int32
* value
, int32 newValue
, int32 testAgainst
)
278 __atomic_compare_exchange_n(value
, &testAgainst
, newValue
, 1,
279 __ATOMIC_SEQ_CST
, __ATOMIC_SEQ_CST
);
284 static __inline__ int32
285 atomic_add(int32
* value
, int32 addValue
)
287 return __atomic_fetch_add(value
, addValue
, __ATOMIC_SEQ_CST
);
291 static __inline__ int32
292 atomic_and(int32
* value
, int32 andValue
)
294 return __atomic_fetch_and(value
, andValue
, __ATOMIC_SEQ_CST
);
298 static __inline__ int32
299 atomic_or(int32
* value
, int32 orValue
)
301 return __atomic_fetch_or(value
, orValue
, __ATOMIC_SEQ_CST
);
305 static __inline__ int32
306 atomic_get(int32
* value
)
308 return __atomic_load_n(value
, __ATOMIC_ACQUIRE
);
312 static __inline__
void
313 atomic_set64(int64
* value
, int64 newValue
)
315 __atomic_store_n(value
, newValue
, __ATOMIC_RELEASE
);
319 static __inline__ int64
320 atomic_get_and_set64(int64
* value
, int64 newValue
)
322 return __atomic_exchange_n(value
, newValue
, __ATOMIC_SEQ_CST
);
326 static __inline__ int64
327 atomic_test_and_set64(int64
* value
, int64 newValue
, int64 testAgainst
)
329 __atomic_compare_exchange_n(value
, &testAgainst
, newValue
, 1,
330 __ATOMIC_SEQ_CST
, __ATOMIC_SEQ_CST
);
335 static __inline__ int64
336 atomic_add64(int64
* value
, int64 addValue
)
338 return __atomic_fetch_add(value
, addValue
, __ATOMIC_SEQ_CST
);
342 static __inline__ int64
343 atomic_and64(int64
* value
, int64 andValue
)
345 return __atomic_fetch_and(value
, andValue
, __ATOMIC_SEQ_CST
);
349 static __inline__ int64
350 atomic_or64(int64
* value
, int64 orValue
)
352 return __atomic_fetch_or(value
, orValue
, __ATOMIC_SEQ_CST
);
356 static __inline__ int64
357 atomic_get64(int64
* value
)
359 return __atomic_load_n(value
, __ATOMIC_ACQUIRE
);
363 #else /* __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7) */
369 /* Atomic functions; previous value is returned */
370 extern void atomic_set(int32
* value
, int32 newValue
);
371 extern int32
atomic_get_and_set(int32
* value
, int32 newValue
);
372 extern int32
atomic_test_and_set(int32
*value
, int32 newValue
, int32 testAgainst
);
373 extern int32
atomic_add(int32
*value
, int32 addValue
);
374 extern int32
atomic_and(int32
*value
, int32 andValue
);
375 extern int32
atomic_or(int32
*value
, int32 orValue
);
376 extern int32
atomic_get(int32
*value
);
378 extern void atomic_set64(int64
* value
, int64 newValue
);
379 extern int64
atomic_get_and_set64(int64
* value
, int64 newValue
);
380 extern int64
atomic_test_and_set64(int64
*value
, int64 newValue
, int64 testAgainst
);
381 extern int64
atomic_add64(int64
*value
, int64 addValue
);
382 extern int64
atomic_and64(int64
*value
, int64 andValue
);
383 extern int64
atomic_or64(int64
*value
, int64 orValue
);
384 extern int64
atomic_get64(int64
*value
);
393 #endif /* _SUPPORT_DEFS_H */