objc

atomic.h
Go to the documentation of this file.
1 
11 #pragma once
12 #include <stdbool.h>
13 #include <stdint.h>
14 
15 // Some embedded targets (e.g., ARMv6-M / RP2040) have no lock-free atomics.
16 // Clang then warns that builtins may not be lock-free (-Watomic-alignment).
17 // We accept the fallback and suppress the warning locally.
18 #if defined(__clang__)
19 #pragma clang diagnostic push
20 #pragma clang diagnostic ignored "-Watomic-alignment"
21 #endif
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
35 typedef struct sys_atomic_t {
36  uint32_t value;
37 } sys_atomic_t __attribute__((aligned(4)));
38 
50 static inline void sys_atomic_init(sys_atomic_t *a, uint32_t initial) {
51  __atomic_store_n(&a->value, initial, __ATOMIC_RELAXED);
52 }
53 
65 static inline uint32_t sys_atomic_get(const sys_atomic_t *a) {
66  return __atomic_load_n(&a->value, __ATOMIC_RELAXED);
67 }
68 
79 static inline void sys_atomic_set(sys_atomic_t *a, uint32_t v) {
80  __atomic_store_n(&a->value, v, __ATOMIC_RELAXED);
81 }
82 
92 static inline uint32_t sys_atomic_inc(sys_atomic_t *a) {
93  return __atomic_add_fetch(&a->value, 1, __ATOMIC_RELAXED);
94 }
95 
105 static inline uint32_t sys_atomic_dec(sys_atomic_t *a) {
106  return __atomic_sub_fetch(&a->value, 1, __ATOMIC_RELAXED);
107 }
108 
118 static inline void sys_atomic_set_bits(sys_atomic_t *a, uint32_t mask) {
119  (void)__atomic_fetch_or(&a->value, mask, __ATOMIC_RELAXED);
120 }
121 
132 static inline void sys_atomic_clear_bits(sys_atomic_t *a, uint32_t mask) {
133  (void)__atomic_fetch_and(&a->value, ~mask, __ATOMIC_RELAXED);
134 }
135 
136 #if defined(__clang__)
137 #pragma clang diagnostic pop
138 #endif
139 
140 #ifdef __cplusplus
141 }
142 #endif
static void sys_atomic_set_bits(sys_atomic_t *a, uint32_t mask)
Atomically set bits (OR with mask).
Definition: atomic.h:118
static uint32_t sys_atomic_dec(sys_atomic_t *a)
Atomically decrement and return the new value.
Definition: atomic.h:105
struct sys_atomic_t __attribute__((aligned(4)))
Underlying atomic uint32_t value.
static void sys_atomic_init(sys_atomic_t *a, uint32_t initial)
Initialize an atomic with an initial value.
Definition: atomic.h:50
static void sys_atomic_set(sys_atomic_t *a, uint32_t v)
Store a new value atomically.
Definition: atomic.h:79
static uint32_t sys_atomic_inc(sys_atomic_t *a)
Atomically increment and return the new value.
Definition: atomic.h:92
static void sys_atomic_clear_bits(sys_atomic_t *a, uint32_t mask)
Atomically clear bits (AND with ~mask).
Definition: atomic.h:132
static uint32_t sys_atomic_get(const sys_atomic_t *a)
Load the current value atomically.
Definition: atomic.h:65
Underlying atomic uint32_t value.
Definition: atomic.h:35