1#ifndef TREE_SITTER_ATOMIC_H_
 2#define TREE_SITTER_ATOMIC_H_
 3
 4#include <stddef.h>
 5#include <stdint.h>
 6#include <stdlib.h>
 7
 8#ifdef __TINYC__
 9
10static inline size_t atomic_load(const volatile size_t *p) {
11  return *p;
12}
13
14static inline uint32_t atomic_inc(volatile uint32_t *p) {
15  *p += 1;
16  return *p;
17}
18
19static inline uint32_t atomic_dec(volatile uint32_t *p) {
20  *p-= 1;
21  return *p;
22}
23
24#elif defined(_WIN32)
25
26#include <windows.h>
27
28static inline size_t atomic_load(const volatile size_t *p) {
29  return *p;
30}
31
32static inline uint32_t atomic_inc(volatile uint32_t *p) {
33  return InterlockedIncrement((long volatile *)p);
34}
35
36static inline uint32_t atomic_dec(volatile uint32_t *p) {
37  return InterlockedDecrement((long volatile *)p);
38}
39
40#else
41
42static inline size_t atomic_load(const volatile size_t *p) {
43#ifdef __ATOMIC_RELAXED
44  return __atomic_load_n(p, __ATOMIC_RELAXED);
45#else
46  return __sync_fetch_and_add((volatile size_t *)p, 0);
47#endif
48}
49
50static inline uint32_t atomic_inc(volatile uint32_t *p) {
51  #ifdef __ATOMIC_RELAXED
52    return __atomic_add_fetch(p, 1U, __ATOMIC_SEQ_CST);
53  #else
54    return __sync_add_and_fetch(p, 1U);
55  #endif
56}
57
58static inline uint32_t atomic_dec(volatile uint32_t *p) {
59  #ifdef __ATOMIC_RELAXED
60    return __atomic_sub_fetch(p, 1U, __ATOMIC_SEQ_CST);
61  #else
62    return __sync_sub_and_fetch(p, 1U);
63  #endif
64}
65
66#endif
67
68#endif  // TREE_SITTER_ATOMIC_H_