workqueue: make it work on platforms without __sync_fetch_and_add()
[fio.git] / compiler / compiler.h
1 #ifndef FIO_COMPILER_H
2 #define FIO_COMPILER_H
3
4 #if __GNUC__ >= 4
5 #include "compiler-gcc4.h"
6 #elif __GNUC__ == 3
7 #include "compiler-gcc3.h"
8 #else
9 #error Compiler too old, need gcc at least gcc 3.x
10 #endif
11
12 #ifndef __must_check
13 #define __must_check
14 #endif
15
16 /*
17  * Mark unused variables passed to ops functions as unused, to silence gcc
18  */
19 #define fio_unused      __attribute__((__unused__))
20 #define fio_init        __attribute__((constructor))
21 #define fio_exit        __attribute__((destructor))
22
23 #define fio_unlikely(x) __builtin_expect(!!(x), 0)
24
25 /*
26  * Check at compile time that something is of a particular type.
27  * Always evaluates to 1 so you may use it easily in comparisons.
28  */
29 #define typecheck(type,x) \
30 ({      type __dummy; \
31         typeof(x) __dummy2; \
32         (void)(&__dummy == &__dummy2); \
33         1; \
34 })
35
36 #ifndef __compiletime_error
37 #define __compiletime_error(message)
38 #endif
39 #ifndef __compiletime_error_fallback
40 #define __compiletime_error_fallback(condition) do { } while (0)
41 #endif
42
43 #define __compiletime_assert(condition, msg, prefix, suffix)            \
44         do {                                                            \
45                 int __cond = !(condition);                              \
46                 extern void prefix ## suffix(void) __compiletime_error(msg); \
47                 if (__cond)                                             \
48                         prefix ## suffix();                             \
49                 __compiletime_error_fallback(__cond);                   \
50         } while (0)
51
52 #define _compiletime_assert(condition, msg, prefix, suffix) \
53         __compiletime_assert(condition, msg, prefix, suffix)
54
55 #define compiletime_assert(condition, msg) \
56         _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
57
58 #endif