cmake: fix csl generation
[awesomized/libmemcached] / clients / ms_atomic.h
1 /* LibMemcached
2 * Copyright (C) 2006-2009 Brian Aker
3 * All rights reserved.
4 *
5 * Use and distribution licensed under the BSD license. See
6 * the COPYING file in the parent directory for full text.
7 *
8 * Summary:
9 *
10 */
11
12 #ifndef CLIENTS_MS_ATOMIC_H
13 #define CLIENTS_MS_ATOMIC_H
14
15 #if defined(__SUNPRO_C)
16 # define _KERNEL
17 # include <atomic.h>
18 # if SIZEOF_SIZE_T == 8
19 # define atomic_add_size(X, Y) atomic_add_64((X), (Y))
20 # define atomic_add_size_nv(X, Y) atomic_add_64((X), (Y))
21 # define atomic_dec_size(X, Y) atomic_add_64((X), (Y))
22 # define atomic_dec_size_nv(X, Y) atomic_add_64((X), (Y))
23 # else
24 # define atomic_add_size(X, Y) atomic_add_32((X), (Y))
25 # define atomic_add_size_nv(X, Y) atomic_add_32((X), (Y))
26 # define atomic_dec_size(X, Y) atomic_add_32((X), (Y))
27 # define atomic_dec_size_nv(X, Y) atomic_add_32((X), (Y))
28 # endif
29 # undef _KERNEL
30 #elif HAVE_GCC_ATOMIC_BUILTINS
31 # define atomic_add_8(X, Y) __sync_fetch_and_add((X), (Y))
32 # define atomic_add_16(X, Y) __sync_fetch_and_add((X), (Y))
33 # define atomic_add_32(X, Y) __sync_fetch_and_add((X), (Y))
34 # define atomic_add_size(X, Y) __sync_fetch_and_add((X), (Y))
35 # define atomic_dec_8(X) __sync_fetch_and_sub((X), 1)
36 # define atomic_dec_16(X) __sync_fetch_and_sub((X), 1)
37 # define atomic_dec_32(X) __sync_fetch_and_sub((X), 1)
38 # define atomic_dec_size(X) __sync_fetch_and_sub((X), 1)
39 /* The same as above, but these return the new value instead of void */
40 # define atomic_add_8_nv(X, Y) __sync_fetch_and_add((X), (Y))
41 # define atomic_add_16_nv(X, Y) __sync_fetch_and_add((X), (Y))
42 # define atomic_add_32_nv(X, Y) __sync_fetch_and_add((X), (Y))
43 # define atomic_add_size_nv(X, Y) __sync_fetch_and_add((X), (Y))
44 # define atomic_dec_8_nv(X) __sync_fetch_and_sub((X), 1)
45 # define atomic_dec_16_nv(X) __sync_fetch_and_sub((X), 1)
46 # define atomic_dec_32_nv(X) __sync_fetch_and_sub((X), 1)
47 # define atomic_dec_size_nv(X) __sync_fetch_and_sub((X), 1)
48 #elif HAVE_C_STDATOMIC
49 # include <stdatomic.h>
50 # define atomic_add_8(X, Y) atomic_fetch_add(X, Y)
51 # define atomic_add_16(X, Y) atomic_fetch_add(X, Y)
52 # define atomic_add_32(X, Y) atomic_fetch_add(X, Y)
53 # define atomic_add_size(X, Y) atomic_fetch_add(X, Y)
54 # define atomic_dec_8(X) atomic_fetch_sub(X, 1)
55 # define atomic_dec_16(X) atomic_fetch_sub(X, 1)
56 # define atomic_dec_32(X) atomic_fetch_sub(X, 1)
57 # define atomic_dec_size(X) atomic_fetch_sub(X, 1)
58 /* The same as above, but these return the new value instead of void */
59 # define ATOMIC_ADD_FETCH_DECL(T) \
60 static inline T atomic_add_fetch_##T(volatile T *ptr, T add) { \
61 T des, cur = atomic_load(ptr); \
62 do { \
63 des = cur + add; \
64 } while(!atomic_compare_exchange_weak(ptr, &cur, des)); \
65 return des; \
66 }
67 # define ATOMIC_SUB_FETCH_DECL(T) \
68 T atomic_sub_fetch_##T(volatile T *ptr) { \
69 T des, cur = atomic_load(ptr); \
70 do { \
71 des = cur - 1; \
72 } while(!atomic_compare_exchange_weak(ptr, &cur, des)); \
73 return des; \
74 }
75 ATOMIC_ADD_FETCH_DECL(uint8_t)
76 # define atomic_add_8_nv(X, Y) atomic_add_fetch_uint8_t(X, Y)
77 ATOMIC_ADD_FETCH_DECL(uint16_t)
78 # define atomic_add_16_nv(X, Y) atomic_add_fetch_uint16_t(X, Y)
79 ATOMIC_ADD_FETCH_DECL(uint32_t)
80 # define atomic_add_32_nv(X, Y) atomic_add_fetch_uint32_t(X, Y)
81 ATOMIC_ADD_FETCH_DECL(size_t)
82 # define atomic_add_size_nv(X, Y) atomic_add_fetch_size_t(X, Y)
83 # define atomic_dec_8_nv(X) atomic_sub_fetch<uint8_t>(X, Y)
84 # define atomic_dec_16_nv(X) atomic_sub_fetch<uint16_t>(X, Y)
85 # define atomic_dec_32_nv(X) atomic_sub_fetch<uint32_t>(X, Y)
86 # define atomic_dec_size_nv(X) atomic_sub_fetch<size_t>(X, Y)
87 #else
88 #warning "Atomic operators not found so memslap will not work correctly"
89 # define atomic_add_8(X, Y) 0
90 # define atomic_add_16(X, Y) 0
91 # define atomic_add_32(X, Y) 0
92 # define atomic_add_size(X, Y) 0
93 # define atomic_dec_8(X) 0
94 # define atomic_dec_16(X) 0
95 # define atomic_dec_32(X) 0
96 # define atomic_dec_size(X) 0
97 /* The same as above, but these return the new value instead of void */
98 # define atomic_add_8_nv(X, Y) 0
99 # define atomic_add_16_nv(X, Y) 0
100 # define atomic_add_32_nv(X, Y) 0
101 # define atomic_add_size_nv(X, Y) 0
102 # define atomic_dec_8_nv(X) 0
103 # define atomic_dec_16_nv(X) 0
104 # define atomic_dec_32_nv(X) 0
105 # define atomic_dec_size_nv(X) 0
106 #endif /* defined(__SUNPRO_C) */
107
108 #endif /* CLIENTS_MS_ATOMIC_H */