PostgreSQL Source Code: src/include/port/atomics/generic.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#ifndef INSIDE_ATOMICS_H
17# error "should be included via atomics.h"
18#endif
19
20
21
22
23
24#if !defined(pg_read_barrier_impl)
25# define pg_read_barrier_impl pg_memory_barrier_impl
26#endif
27#if !defined(pg_write_barrier_impl)
28# define pg_write_barrier_impl pg_memory_barrier_impl
29#endif
30
31#ifndef PG_HAVE_SPIN_DELAY
32#define PG_HAVE_SPIN_DELAY
33#define pg_spin_delay_impl() ((void)0)
34#endif
35
36
37
38#if !defined(PG_HAVE_ATOMIC_FLAG_SUPPORT) && defined(PG_HAVE_ATOMIC_U32_SUPPORT)
39#define PG_HAVE_ATOMIC_FLAG_SUPPORT
41#endif
42
43#ifndef PG_HAVE_ATOMIC_READ_U32
44#define PG_HAVE_ATOMIC_READ_U32
47{
48 return ptr->value;
49}
50#endif
51
52#ifndef PG_HAVE_ATOMIC_WRITE_U32
53#define PG_HAVE_ATOMIC_WRITE_U32
54static inline void
59#endif
60
61#ifndef PG_HAVE_ATOMIC_UNLOCKED_WRITE_U32
62#define PG_HAVE_ATOMIC_UNLOCKED_WRITE_U32
63static inline void
68#endif
69
70
71
72
73#if !defined(PG_HAVE_ATOMIC_TEST_SET_FLAG) && defined(PG_HAVE_ATOMIC_EXCHANGE_U32)
74
75#define PG_HAVE_ATOMIC_INIT_FLAG
76static inline void
78{
80}
81
82#define PG_HAVE_ATOMIC_TEST_SET_FLAG
83static inline bool
85{
87}
88
89#define PG_HAVE_ATOMIC_UNLOCKED_TEST_FLAG
90static inline bool
92{
94}
95
96
97#define PG_HAVE_ATOMIC_CLEAR_FLAG
98static inline void
100{
101
104}
105
106
107
108
109
110#elif !defined(PG_HAVE_ATOMIC_TEST_SET_FLAG) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)
111
112#define PG_HAVE_ATOMIC_INIT_FLAG
113static inline void
115{
117}
118
119#define PG_HAVE_ATOMIC_TEST_SET_FLAG
120static inline bool
122{
125}
126
127#define PG_HAVE_ATOMIC_UNLOCKED_TEST_FLAG
128static inline bool
130{
132}
133
134#define PG_HAVE_ATOMIC_CLEAR_FLAG
135static inline void
137{
138
141}
142
143#elif !defined(PG_HAVE_ATOMIC_TEST_SET_FLAG)
144# error "No pg_atomic_test_and_set provided"
145#endif
146
147
148#ifndef PG_HAVE_ATOMIC_INIT_U32
149#define PG_HAVE_ATOMIC_INIT_U32
150static inline void
155#endif
156
157#if !defined(PG_HAVE_ATOMIC_EXCHANGE_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)
158#define PG_HAVE_ATOMIC_EXCHANGE_U32
161{
165 ;
166 return old;
167}
168#endif
169
170#if !defined(PG_HAVE_ATOMIC_FETCH_ADD_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)
171#define PG_HAVE_ATOMIC_FETCH_ADD_U32
174{
178 ;
179 return old;
180}
181#endif
182
183#if !defined(PG_HAVE_ATOMIC_FETCH_SUB_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)
184#define PG_HAVE_ATOMIC_FETCH_SUB_U32
187{
189}
190#endif
191
192#if !defined(PG_HAVE_ATOMIC_FETCH_AND_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)
193#define PG_HAVE_ATOMIC_FETCH_AND_U32
196{
200 ;
201 return old;
202}
203#endif
204
205#if !defined(PG_HAVE_ATOMIC_FETCH_OR_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)
206#define PG_HAVE_ATOMIC_FETCH_OR_U32
209{
213 ;
214 return old;
215}
216#endif
217
218#if !defined(PG_HAVE_ATOMIC_ADD_FETCH_U32) && defined(PG_HAVE_ATOMIC_FETCH_ADD_U32)
219#define PG_HAVE_ATOMIC_ADD_FETCH_U32
222{
224}
225#endif
226
227#if !defined(PG_HAVE_ATOMIC_SUB_FETCH_U32) && defined(PG_HAVE_ATOMIC_FETCH_SUB_U32)
228#define PG_HAVE_ATOMIC_SUB_FETCH_U32
231{
233}
234#endif
235
236#if !defined(PG_HAVE_ATOMIC_READ_MEMBARRIER_U32) && defined(PG_HAVE_ATOMIC_FETCH_ADD_U32)
237#define PG_HAVE_ATOMIC_READ_MEMBARRIER_U32
240{
242}
243#endif
244
245#if !defined(PG_HAVE_ATOMIC_WRITE_MEMBARRIER_U32) && defined(PG_HAVE_ATOMIC_EXCHANGE_U32)
246#define PG_HAVE_ATOMIC_WRITE_MEMBARRIER_U32
247static inline void
249{
251}
252#endif
253
254#if !defined(PG_HAVE_ATOMIC_EXCHANGE_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)
255#define PG_HAVE_ATOMIC_EXCHANGE_U64
258{
262 ;
263 return old;
264}
265#endif
266
267#ifndef PG_HAVE_ATOMIC_WRITE_U64
268#define PG_HAVE_ATOMIC_WRITE_U64
269
270#if defined(PG_HAVE_8BYTE_SINGLE_COPY_ATOMICITY) && \
271 !defined(PG_HAVE_ATOMIC_U64_SIMULATION)
272
273static inline void
275{
276
277
278
279
280
283}
284
285#else
286
287static inline void
289{
290
291
292
293
295}
296
297#endif
298#endif
299
300#ifndef PG_HAVE_ATOMIC_UNLOCKED_WRITE_U64
301#define PG_HAVE_ATOMIC_UNLOCKED_WRITE_U64
302static inline void
307#endif
308
309#ifndef PG_HAVE_ATOMIC_READ_U64
310#define PG_HAVE_ATOMIC_READ_U64
311
312#if defined(PG_HAVE_8BYTE_SINGLE_COPY_ATOMICITY) && \
313 !defined(PG_HAVE_ATOMIC_U64_SIMULATION)
314
317{
318
319
320
322 return ptr->value;
323}
324
325#else
326
329{
331
332
333
334
335
336
337
339
340 return old;
341}
342#endif
343#endif
344
345#ifndef PG_HAVE_ATOMIC_INIT_U64
346#define PG_HAVE_ATOMIC_INIT_U64
347static inline void
352#endif
353
354#if !defined(PG_HAVE_ATOMIC_FETCH_ADD_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)
355#define PG_HAVE_ATOMIC_FETCH_ADD_U64
358{
362 ;
363 return old;
364}
365#endif
366
367#if !defined(PG_HAVE_ATOMIC_FETCH_SUB_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)
368#define PG_HAVE_ATOMIC_FETCH_SUB_U64
371{
373}
374#endif
375
376#if !defined(PG_HAVE_ATOMIC_FETCH_AND_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)
377#define PG_HAVE_ATOMIC_FETCH_AND_U64
380{
384 ;
385 return old;
386}
387#endif
388
389#if !defined(PG_HAVE_ATOMIC_FETCH_OR_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)
390#define PG_HAVE_ATOMIC_FETCH_OR_U64
393{
397 ;
398 return old;
399}
400#endif
401
402#if !defined(PG_HAVE_ATOMIC_ADD_FETCH_U64) && defined(PG_HAVE_ATOMIC_FETCH_ADD_U64)
403#define PG_HAVE_ATOMIC_ADD_FETCH_U64
406{
408}
409#endif
410
411#if !defined(PG_HAVE_ATOMIC_SUB_FETCH_U64) && defined(PG_HAVE_ATOMIC_FETCH_SUB_U64)
412#define PG_HAVE_ATOMIC_SUB_FETCH_U64
415{
417}
418#endif
419
420#if !defined(PG_HAVE_ATOMIC_READ_MEMBARRIER_U64) && defined(PG_HAVE_ATOMIC_FETCH_ADD_U64)
421#define PG_HAVE_ATOMIC_READ_MEMBARRIER_U64
424{
426}
427#endif
428
429#if !defined(PG_HAVE_ATOMIC_WRITE_MEMBARRIER_U64) && defined(PG_HAVE_ATOMIC_EXCHANGE_U64)
430#define PG_HAVE_ATOMIC_WRITE_MEMBARRIER_U64
431static inline void
433{
435}
436#endif
static bool pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 *expected, uint32 newval)
static uint32 pg_atomic_fetch_add_u32_impl(volatile pg_atomic_uint32 *ptr, int32 add_)
uint64 pg_atomic_fetch_add_u64_impl(volatile pg_atomic_uint64 *ptr, int64 add_)
bool pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 *expected, uint64 newval)
#define AssertPointerAlignment(ptr, bndr)
#define pg_memory_barrier_impl()
static uint32 pg_atomic_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 newval)
static void pg_atomic_unlocked_write_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 val)
static uint64 pg_atomic_read_u64_impl(volatile pg_atomic_uint64 *ptr)
static void pg_atomic_write_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 val)
static void pg_atomic_unlocked_write_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 val)
static void pg_atomic_init_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 val_)
static void pg_atomic_write_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 val)
static uint32 pg_atomic_read_u32_impl(volatile pg_atomic_uint32 *ptr)
static void pg_atomic_init_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 val_)