blob: fc5b53dfefc801a7879e5c4457716e5bf201fafe (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
#include "atomic.h"
#ifdef _MSC_VER
# include <intrin.h>
# ifdef _WIN64
# pragma intrinsic(_InterlockedExchange64)
# pragma intrinsic(_InterlockedExchangeAdd64)
# define InterlockedExchange_ _InterlockedExchange64
# define InterlockedExchangeAdd_ _InterlockedExchangeAdd64
# else
# pragma intrinsic(_InterlockedExchange32)
# pragma intrinsic(_InterlockedExchangeAdd32)
# define InterlockedExchange_ _InterlockedExchange32
# define InterlockedExchangeAdd_ _InterlockedExchangeAdd32
# endif
void kit_atomic_store_explicit(volatile KIT_ATOMIC_VAR *var,
KIT_ATOMIC_VAR value,
int memory_order) {
InterlockedExchange_(var, value);
}
KIT_ATOMIC_VAR kit_atomic_load_explicit(volatile KIT_ATOMIC_VAR *var,
int memory_order) {
if (memory_order == memory_order_relaxed)
return *var;
return InterlockedExchangeAdd_(var, 0);
}
KIT_ATOMIC_VAR kit_atomic_fetch_add_explicit(
volatile KIT_ATOMIC_VAR *var, KIT_ATOMIC_VAR value,
int memory_order) {
return InterlockedExchangeAdd_(var, value);
}
KIT_ATOMIC_VAR kit_atomic_exchange_explicit(
volatile KIT_ATOMIC_VAR *var, KIT_ATOMIC_VAR value,
int memory_order) {
return InterlockedExchange_(var, value);
}
#endif
|