Add support for compiling pixman without thread/tls support
[profile/ivi/pixman.git] / pixman / pixman-compiler.h
1 /* Pixman uses some non-standard compiler features. This file ensures
2  * they exist
3  *
4  * The features are:
5  *
6  *    FUNC           must be defined to expand to the current function
7  *    PIXMAN_EXPORT  should be defined to whatever is required to
8  *                   export functions from a shared library
9  *    limits         limits for various types must be defined
10  *    inline         must be defined
11  *    force_inline   must be defined
12  */
13 #if defined (__GNUC__)
14 #  define FUNC     ((const char*) (__PRETTY_FUNCTION__))
15 #elif defined (__sun) || (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L)
16 #  define FUNC     ((const char*) (__func__))
17 #else
18 #  define FUNC     ((const char*) ("???"))
19 #endif
20
21 #ifndef INT16_MIN
22 # define INT16_MIN              (-32767-1)
23 #endif
24
25 #ifndef INT16_MAX
26 # define INT16_MAX              (32767)
27 #endif
28
29 #ifndef INT32_MIN
30 # define INT32_MIN              (-2147483647-1)
31 #endif
32
33 #ifndef INT32_MAX
34 # define INT32_MAX              (2147483647)
35 #endif
36
37 #ifndef UINT32_MIN
38 # define UINT32_MIN             (0)
39 #endif
40
41 #ifndef UINT32_MAX
42 # define UINT32_MAX             (4294967295U)
43 #endif
44
45 #ifndef M_PI
46 # define M_PI                   3.14159265358979323846
47 #endif
48
49 #ifdef _MSC_VER
50 /* 'inline' is available only in C++ in MSVC */
51 #   define inline __inline
52 #   define force_inline __forceinline
53 #elif defined __GNUC__ || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))
54 #   define inline __inline__
55 #   define force_inline __inline__ __attribute__ ((__always_inline__))
56 #else
57 #   ifndef force_inline
58 #      define force_inline inline
59 #   endif
60 #endif
61
62 /* GCC visibility */
63 #if defined(__GNUC__) && __GNUC__ >= 4
64 #   define PIXMAN_EXPORT __attribute__ ((visibility("default")))
65 /* Sun Studio 8 visibility */
66 #elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550)
67 #   define PIXMAN_EXPORT __global
68 #else
69 #   define PIXMAN_EXPORT
70 #endif
71
72 /* TLS */
73 #if defined(PIXMAN_NO_TLS)
74
75 #   define PIXMAN_DEFINE_THREAD_LOCAL(type, name)            \
76     static type name
77 #   define PIXMAN_GET_THREAD_LOCAL(name)                \
78     (&name)
79
80 #elif defined(TOOLCHAIN_SUPPORTS__THREAD)
81
82 #   define PIXMAN_DEFINE_THREAD_LOCAL(type, name)                       \
83     static __thread type name
84 #   define PIXMAN_GET_THREAD_LOCAL(name)                                \
85     (&name)
86
87 #elif defined(_MSC_VER)
88
89 #   define PIXMAN_DEFINE_THREAD_LOCAL(type, name)                       \
90     static __declspec(thread) type name
91 #   define PIXMAN_GET_THREAD_LOCAL(name)                                \
92     (&name)
93
94 #elif defined(HAVE_PTHREAD_SETSPECIFIC)
95
96 #include <pthread.h>
97
98 #  define PIXMAN_DEFINE_THREAD_LOCAL(type, name)                        \
99     static pthread_once_t tls_ ## name ## _once_control = PTHREAD_ONCE_INIT; \
100     static pthread_key_t tls_ ## name ## _key;                          \
101                                                                         \
102     static void                                                         \
103     tls_ ## name ## _make_key (void)                                    \
104     {                                                                   \
105         pthread_key_create (&tls_ ## name ## _key, NULL);               \
106     }                                                                   \
107                                                                         \
108     static type *                                                       \
109     tls_ ## name ## _alloc (void)                                       \
110     {                                                                   \
111         type *value = calloc (1, sizeof (type));                        \
112         if (value)                                                      \
113             pthread_setspecific (tls_ ## name ## _key, value);          \
114         return value;                                                   \
115     }                                                                   \
116                                                                         \
117     static force_inline type *                                          \
118     tls_ ## name ## _get (void)                                         \
119     {                                                                   \
120         type *value = NULL;                                             \
121         if (pthread_once (&tls_ ## name ## _once_control,               \
122                           tls_ ## name ## _make_key) == 0)              \
123         {                                                               \
124             value = pthread_getspecific (tls_ ## name ## _key);         \
125             if (!value)                                                 \
126                 value = tls_ ## name ## _alloc ();                      \
127         }                                                               \
128         return value;                                                   \
129     }
130
131 #   define PIXMAN_GET_THREAD_LOCAL(name)                                \
132     tls_ ## name ## _get ()
133
134 #else
135
136 #    error "Unknown thread local support for this system. Pixman will not work with multiple threads. Define PIXMAN_NO_TLS to acknowledge and accept this limitation and compile pixman without thread-safety support."
137
138 #endif