aboutsummaryrefslogtreecommitdiff
path: root/vendor/github.com/mitjafelicijan/go-tree-sitter/atomic.h
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/mitjafelicijan/go-tree-sitter/atomic.h')
-rw-r--r--vendor/github.com/mitjafelicijan/go-tree-sitter/atomic.h68
1 files changed, 68 insertions, 0 deletions
diff --git a/vendor/github.com/mitjafelicijan/go-tree-sitter/atomic.h b/vendor/github.com/mitjafelicijan/go-tree-sitter/atomic.h
new file mode 100644
index 0000000..e680b60
--- /dev/null
+++ b/vendor/github.com/mitjafelicijan/go-tree-sitter/atomic.h
@@ -0,0 +1,68 @@
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_