summaryrefslogtreecommitdiff
path: root/source/kit/atomic.c
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