acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
atomic.h
1//
2// atomic.h
3// acme
4//
5// Created by Camilo Sasuke Thomas Borregaard Soerensen on 02/06/19.
6//
7#pragma once
8
9
10#ifdef WINDOWS
11
15#include <intrin.h>
16
17
18#pragma intrinsic (_InterlockedIncrement)
19#pragma intrinsic (_InterlockedDecrement)
20#pragma intrinsic (_interlockedincrement64)
21#pragma intrinsic (_interlockeddecrement64)
22#pragma intrinsic (_interlockedadd64)
23#pragma intrinsic (_interlockedadd)
24
25
26#endif
27
28#ifdef WINDOWS
29
30#define atomic_assign64(pi, i) _interlockedexchange64((::i64 *) (pi), i)
31
32#else
33
34inline ::i64 atomic_assign64(::i64 * pi, ::i64 i)
35{
36
37
38#if defined(RASPBERRYPIOS) && defined(OS32BIT)
39
40 return __sync_lock_test_and_set_4(pi, i);
41
42#else
43
44 return __sync_lock_test_and_set(pi, i);
45
46#endif
47
48}
49
50
51#endif
52
53
54#ifdef WINDOWS
55
56#define atomic_increment64(pi) _interlockedincrement64((::i64 *) (pi))
57
58#else
59
60inline ::i64 atomic_increment64(::i64 * pi)
61{
62
63
64#if defined(RASPBERRYPIOS) && defined(OS32BIT)
65
66 return __sync_add_and_fetch_4(pi, 1);
67
68#else
69
70 return __sync_add_and_fetch(pi, 1);
71
72#endif
73
74}
75
76
77#endif
78
79
80#ifdef WINDOWS
81
82#define atomic_assign32(pi, i) _InterlockedExchange((long *)(pi), i)
83
84#else
85
86inline ::i32 atomic_assign32(::i32* pi, ::i32 i)
87{
88
89#if defined(RASPBERRYPIOS) && defined(OS32BIT)
90
91 return __sync_lock_test_and_set_4(pi, i);
92
93#else
94
95 return __sync_lock_test_and_set(pi, i);
96
97#endif
98
99}
100
101#endif
102
103
104#ifdef WINDOWS
105
106#define atomic_increment32(pi) _InterlockedIncrement((long *)(pi))
107
108#else
109
110inline ::i32 atomic_increment32(::i32* pi)
111{
112
113#if defined(RASPBERRYPIOS) && defined(OS32BIT)
114
115 return __sync_add_and_fetch_4(pi, 1);
116
117#else
118
119 return __sync_add_and_fetch(pi, 1);
120
121#endif
122
123}
124
125#endif
126
127
128
129#ifdef WINDOWS
130
131 #define atomic_decrement64(pi) _interlockeddecrement64((::i64 *)(pi))
132
133#else
134
135 inline ::i64 atomic_decrement64(::i64 * pi)
136 {
137
138#if defined(RASPBERRYPIOS) && defined(OS32BIT)
139
140 return __sync_sub_and_fetch_4(pi, 1);
141
142#else
143
144 return __sync_sub_and_fetch(pi, 1);
145
146#endif
147
148 }
149
150#endif
151
152
153#ifdef WINDOWS
154
155 #define atomic_decrement32(pi) _InterlockedDecrement((long*)(pi))
156
157#else
158
159 inline ::i32 atomic_decrement32(::i32 * pi)
160 {
161
162#if defined(RASPBERRYPIOS) && defined(OS32BIT)
163
164 return __sync_sub_and_fetch_4(pi, 1);
165
166#else
167
168 return __sync_sub_and_fetch(pi, 1);
169
170#endif
171
172 }
173
174#endif
175
176
177
178#ifdef WINDOWS
179
180 #define atomic_add64(pi, i) _interlockedadd64((::i64 *)(pi),(::i64) (i))
181
182#else
183
184inline ::i64 atomic_add64(::i64* pi, ::i64 i)
185{
186
187#if defined(RASPBERRYPIOS) && defined(OS32BIT)
188
189 return __sync_add_and_fetch_4(pi, 1);
190
191#else
192
193 return __sync_add_and_fetch(pi, i);
194
195#endif
196
197 }
198
199#endif
200
201
202
203#ifdef WINDOWS
204
205 #define atomic_add32(pi, i) _interlockedadd((long *)(pi),(long) (i))
206
207#else
208
209inline ::i32 atomic_add32(::i32* pi, ::i32 i)
210{
211
212#if defined(RASPBERRYPIOS) && defined(OS32BIT)
213
214 return __sync_add_and_fetch_4(pi, 1);
215
216#else
217
218 return __sync_add_and_fetch(pi, i);
219
220#endif
221
222 }
223
224#endif
225
226
227
228#ifdef WINDOWS
229
230#define atomic_subtract64(pi, i) _interlockedadd64((::i64 *)(pi), (::i64) (-(i)))
231
232#else
233
234 inline ::i64 atomic_subtract64(::i64* pi, ::i64 i)
235 {
236
237#if defined(RASPBERRYPIOS) && defined(OS32BIT)
238
239 return __sync_sub_and_fetch_4(pi, 1);
240
241#else
242
243 return __sync_sub_and_fetch(pi, i);
244
245#endif
246
247 }
248
249#endif
250
251
252
253#ifdef WINDOWS
254
255#define atomic_subtract32(pi, i) _interlockedadd((long*)(pi), (long)(-(i)))
256
257#else
258
259inline ::i32 atomic_subtract32(::i32* pi, ::i32 i)
260{
261
262#if defined(RASPBERRYPIOS) && defined(OS32BIT)
263
264 return __sync_sub_and_fetch_4(pi, 1);
265
266#else
267
268 return __sync_sub_and_fetch(pi, i);
269
270#endif
271
272}
273
274#endif
275
276
277