22#ifndef DT_SYSTEM_ATOMIC_H
23#define DT_SYSTEM_ATOMIC_H
34#if defined(__cplusplus) && __cplusplus > 201100
39typedef void *dt_atomic_ptr;
44 __atomic_store_n(var,
value, __ATOMIC_SEQ_CST);
48 return __atomic_load_n(var, __ATOMIC_SEQ_CST);
51static inline void *
dt_atomic_get_ptr(
const dt_atomic_ptr *var) {
return __atomic_load_n(var, __ATOMIC_SEQ_CST); }
58 return __atomic_compare_exchange_n(var, expected,
value, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
64#elif !defined(__STDC_NO_ATOMICS__)
82{
return atomic_compare_exchange_strong(var,expected,
value); }
87#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNU_MINOR__ >= 8))
92typedef volatile uint64_t dt_atomic_uint64;
93typedef void *
volatile dt_atomic_ptr;
96{
int value ; __atomic_load(var,&
value,__ATOMIC_SEQ_CST);
return value; }
102{
void *
value; __atomic_load(var,&
value,__ATOMIC_SEQ_CST);
return value; }
107{
int orig; __atomic_exchange(var,&
value,&orig,__ATOMIC_SEQ_CST);
return orig; }
109{
void *orig; __atomic_exchange(var,&
value,&orig,__ATOMIC_SEQ_CST);
return orig; }
111{
return __atomic_compare_exchange(var,expected,&
value,0,__ATOMIC_SEQ_CST,__ATOMIC_SEQ_CST); }
121extern pthread_mutex_t dt_atom_mutex;
125typedef void *dt_atomic_ptr;
128 pthread_mutex_lock(&dt_atom_mutex);
130 pthread_mutex_unlock(&dt_atom_mutex);
135 pthread_mutex_lock(&dt_atom_mutex);
137 pthread_mutex_unlock(&dt_atom_mutex);
142 pthread_mutex_lock(&dt_atom_mutex);
144 pthread_mutex_unlock(&dt_atom_mutex);
149 pthread_mutex_lock(&dt_atom_mutex);
151 pthread_mutex_unlock(&dt_atom_mutex);
157 pthread_mutex_lock(&dt_atom_mutex);
159 pthread_mutex_unlock(&dt_atom_mutex);
165 pthread_mutex_lock(&dt_atom_mutex);
167 pthread_mutex_unlock(&dt_atom_mutex);
173 pthread_mutex_lock(&dt_atom_mutex);
176 pthread_mutex_unlock(&dt_atom_mutex);
182 pthread_mutex_lock(&dt_atom_mutex);
185 pthread_mutex_unlock(&dt_atom_mutex);
191 pthread_mutex_lock(&dt_atom_mutex);
192 int origvalue = *var;
194 pthread_mutex_unlock(&dt_atom_mutex);
200 pthread_mutex_lock(&dt_atom_mutex);
201 void *origvalue = *var;
203 pthread_mutex_unlock(&dt_atom_mutex);
209 pthread_mutex_lock(&dt_atom_mutex);
210 int origvalue = *var;
212 if (origvalue == *expected)
217 *expected = origvalue;
218 pthread_mutex_unlock(&dt_atom_mutex);
224 pthread_mutex_lock(&dt_atom_mutex);
226 pthread_mutex_unlock(&dt_atom_mutex);
231 pthread_mutex_lock(&dt_atom_mutex);
233 pthread_mutex_unlock(&dt_atom_mutex);
static void dt_atomic_set_int(dt_atomic_int *var, int value)
static void * dt_atomic_exch_ptr(dt_atomic_ptr *var, void *value)
static void dt_atomic_set_uint64(dt_atomic_uint64 *var, uint64_t value)
static int dt_atomic_add_int(dt_atomic_int *var, int incr)
static void * dt_atomic_get_ptr(const dt_atomic_ptr *var)
typedef _Atomic(uint64_t) dt_atomic_uint64
static void dt_atomic_or_int(dt_atomic_int *var, int flags)
static int dt_atomic_sub_int(dt_atomic_int *var, int decr)
static uint64_t dt_atomic_get_uint64(const dt_atomic_uint64 *var)
static int dt_atomic_exch_int(dt_atomic_int *var, int value)
static void dt_atomic_set_ptr(dt_atomic_ptr *var, void *value)
static int dt_atomic_CAS_int(dt_atomic_int *var, int *expected, int value)
static void dt_atomic_and_int(dt_atomic_int *var, int flags)
static int dt_atomic_get_int(dt_atomic_int *var)
dt_mipmap_buffer_dsc_flags flags
static const dt_aligned_pixel_simd_t value
unsigned __int64 uint64_t