CX Framework
Cross-platform C utility framework
Loading...
Searching...
No Matches
atomic.h
1#pragma once
2
3// Platform-specific atomics implementation (lifted from jemalloc 5.x)
4// This implements C11-style atomics.
5#include <cx/cx.h>
6#include <cx/platform/base.h>
7
8#if defined(_COMPILER_MSVC)
9#include <cx/platform/msvc/msvc_atomic.h>
10#elif defined(_COMPILER_CLANG) || defined(_COMPILER_GCC)
11#include <cx/platform/clang/clang_atomic.h>
12#endif
13
14/*
15 * This header gives more or less a backport of C11 atomics. The user can write
16 * CX_GENERATE_ATOMICS(type, short_type, lg_sizeof_type); to generate
17 * counterparts of the C11 atomic functions for type, as so:
18 * CX_GENERATE_ATOMICS(int *, pi, 3);
19 * and then write things like:
20 * int *some_ptr;
21 * atomic(pi) atomic_ptr_to_int;
22 * atomicStore(pi, &atomic_ptr_to_int, some_ptr, Relaxed);
23 * int *prev_value = atomicExchange(pi, &ptr_to_int, NULL, AcqRel);
24 * assert(some_ptr == prev_value);
25 * and expect things to work in the obvious way.
26 *
27 * Also included (with naming differences to avoid conflicts with the standard
28 * library):
29 * atomicFence(MemoryOrder) (mimics C11's atomic_thread_fence).
30 * atomicInit (mimics C11's ATOMIC_VAR_INIT).
31 */
32
33#ifdef _64BIT
34CX_GENERATE_ATOMICS(void *, ptr, 3)
35CX_GENERATE_ATOMICS(bool, bool, 0)
36CX_GENERATE_INT_ATOMICS(size_t, size, 3)
37CX_GENERATE_INT_ATOMICS(intptr, intptr, 3)
38CX_GENERATE_INT_ATOMICS(int8, int8, 0)
39CX_GENERATE_INT_ATOMICS(int16, int16, 1)
40CX_GENERATE_INT_ATOMICS(int32, int32, 2)
41CX_GENERATE_INT_ATOMICS(int64, int64, 3)
42CX_GENERATE_INT_ATOMICS(uintptr, uintptr, 3)
43CX_GENERATE_INT_ATOMICS(uint8, uint8, 0)
44CX_GENERATE_INT_ATOMICS(uint16, uint16, 1)
45CX_GENERATE_INT_ATOMICS(uint32, uint32, 2)
46CX_GENERATE_INT_ATOMICS(uint64, uint64, 3)
47#else
48CX_GENERATE_ATOMICS(void *, ptr, 2)
49CX_GENERATE_ATOMICS(bool, bool, 0)
50CX_GENERATE_INT_ATOMICS(size_t, size, 2)
51CX_GENERATE_INT_ATOMICS(intptr, intptr, 2)
52CX_GENERATE_INT_ATOMICS(int8, int8, 0)
53CX_GENERATE_INT_ATOMICS(int16, int16, 1)
54CX_GENERATE_INT_ATOMICS(int32, int32, 2)
55CX_GENERATE_INT_ATOMICS(uintptr, uintptr, 2)
56CX_GENERATE_INT_ATOMICS(uint8, uint8, 0)
57CX_GENERATE_INT_ATOMICS(uint16, uint16, 1)
58CX_GENERATE_INT_ATOMICS(uint32, uint32, 2)
59#endif
Compiler and platform detection macros.