]>
git.saurik.com Git - redis.git/blob - deps/jemalloc.orig/include/jemalloc/internal/atomic.h
1 /******************************************************************************/
2 #ifdef JEMALLOC_H_TYPES
4 #endif /* JEMALLOC_H_TYPES */
5 /******************************************************************************/
6 #ifdef JEMALLOC_H_STRUCTS
8 #endif /* JEMALLOC_H_STRUCTS */
9 /******************************************************************************/
10 #ifdef JEMALLOC_H_EXTERNS
12 #define atomic_read_uint64(p) atomic_add_uint64(p, 0)
13 #define atomic_read_uint32(p) atomic_add_uint32(p, 0)
15 #if (LG_SIZEOF_PTR == 3)
16 # define atomic_read_z(p) \
17 (size_t)atomic_add_uint64((uint64_t *)p, (uint64_t)0)
18 # define atomic_add_z(p, x) \
19 (size_t)atomic_add_uint64((uint64_t *)p, (uint64_t)x)
20 # define atomic_sub_z(p, x) \
21 (size_t)atomic_sub_uint64((uint64_t *)p, (uint64_t)x)
22 #elif (LG_SIZEOF_PTR == 2)
23 # define atomic_read_z(p) \
24 (size_t)atomic_add_uint32((uint32_t *)p, (uint32_t)0)
25 # define atomic_add_z(p, x) \
26 (size_t)atomic_add_uint32((uint32_t *)p, (uint32_t)x)
27 # define atomic_sub_z(p, x) \
28 (size_t)atomic_sub_uint32((uint32_t *)p, (uint32_t)x)
31 #endif /* JEMALLOC_H_EXTERNS */
32 /******************************************************************************/
33 #ifdef JEMALLOC_H_INLINES
35 #ifndef JEMALLOC_ENABLE_INLINE
36 uint64_t atomic_add_uint64(uint64_t *p
, uint64_t x
);
37 uint64_t atomic_sub_uint64(uint64_t *p
, uint64_t x
);
38 uint32_t atomic_add_uint32(uint32_t *p
, uint32_t x
);
39 uint32_t atomic_sub_uint32(uint32_t *p
, uint32_t x
);
42 #if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_ATOMIC_C_))
43 /******************************************************************************/
44 /* 64-bit operations. */
45 #ifdef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8
46 JEMALLOC_INLINE
uint64_t
47 atomic_add_uint64(uint64_t *p
, uint64_t x
)
50 return (__sync_add_and_fetch(p
, x
));
53 JEMALLOC_INLINE
uint64_t
54 atomic_sub_uint64(uint64_t *p
, uint64_t x
)
57 return (__sync_sub_and_fetch(p
, x
));
59 #elif (defined(JEMALLOC_OSATOMIC))
60 JEMALLOC_INLINE
uint64_t
61 atomic_add_uint64(uint64_t *p
, uint64_t x
)
64 return (OSAtomicAdd64((int64_t)x
, (int64_t *)p
));
67 JEMALLOC_INLINE
uint64_t
68 atomic_sub_uint64(uint64_t *p
, uint64_t x
)
71 return (OSAtomicAdd64(-((int64_t)x
), (int64_t *)p
));
73 #elif (defined(__amd64_) || defined(__x86_64__))
74 JEMALLOC_INLINE
uint64_t
75 atomic_add_uint64(uint64_t *p
, uint64_t x
)
80 : "+r" (x
), "=m" (*p
) /* Outputs. */
81 : "m" (*p
) /* Inputs. */
87 JEMALLOC_INLINE
uint64_t
88 atomic_sub_uint64(uint64_t *p
, uint64_t x
)
91 x
= (uint64_t)(-(int64_t)x
);
94 : "+r" (x
), "=m" (*p
) /* Outputs. */
95 : "m" (*p
) /* Inputs. */
101 # if (LG_SIZEOF_PTR == 3)
102 # error "Missing implementation for 64-bit atomic operations"
106 /******************************************************************************/
107 /* 32-bit operations. */
108 #ifdef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
109 JEMALLOC_INLINE
uint32_t
110 atomic_add_uint32(uint32_t *p
, uint32_t x
)
113 return (__sync_add_and_fetch(p
, x
));
116 JEMALLOC_INLINE
uint32_t
117 atomic_sub_uint32(uint32_t *p
, uint32_t x
)
120 return (__sync_sub_and_fetch(p
, x
));
122 #elif (defined(JEMALLOC_OSATOMIC))
123 JEMALLOC_INLINE
uint32_t
124 atomic_add_uint32(uint32_t *p
, uint32_t x
)
127 return (OSAtomicAdd32((int32_t)x
, (int32_t *)p
));
130 JEMALLOC_INLINE
uint32_t
131 atomic_sub_uint32(uint32_t *p
, uint32_t x
)
134 return (OSAtomicAdd32(-((int32_t)x
), (int32_t *)p
));
136 #elif (defined(__i386__) || defined(__amd64_) || defined(__x86_64__))
137 JEMALLOC_INLINE
uint32_t
138 atomic_add_uint32(uint32_t *p
, uint32_t x
)
142 "lock; xaddl %0, %1;"
143 : "+r" (x
), "=m" (*p
) /* Outputs. */
144 : "m" (*p
) /* Inputs. */
150 JEMALLOC_INLINE
uint32_t
151 atomic_sub_uint32(uint32_t *p
, uint32_t x
)
154 x
= (uint32_t)(-(int32_t)x
);
156 "lock; xaddl %0, %1;"
157 : "+r" (x
), "=m" (*p
) /* Outputs. */
158 : "m" (*p
) /* Inputs. */
164 # error "Missing implementation for 32-bit atomic operations"
168 #endif /* JEMALLOC_H_INLINES */
169 /******************************************************************************/