18#pragma intrinsic (_InterlockedIncrement)
19#pragma intrinsic (_InterlockedDecrement)
20#pragma intrinsic (_interlockedincrement64)
21#pragma intrinsic (_interlockeddecrement64)
22#pragma intrinsic (_interlockedadd64)
23#pragma intrinsic (_interlockedadd)
30#define atomic_assign64(pi, i) _interlockedexchange64((::i64 *) (pi), i)
34inline ::i64 atomic_assign64(::i64 * pi, ::i64 i)
38#if defined(RASPBERRYPIOS) && defined(OS32BIT)
40 return __sync_lock_test_and_set_4(pi, i);
44 return __sync_lock_test_and_set(pi, i);
56#define atomic_increment64(pi) _interlockedincrement64((::i64 *) (pi))
60inline ::i64 atomic_increment64(::i64 * pi)
64#if defined(RASPBERRYPIOS) && defined(OS32BIT)
66 return __sync_add_and_fetch_4(pi, 1);
70 return __sync_add_and_fetch(pi, 1);
82#define atomic_assign32(pi, i) _InterlockedExchange((long *)(pi), i)
86inline ::i32 atomic_assign32(::i32* pi, ::i32 i)
89#if defined(RASPBERRYPIOS) && defined(OS32BIT)
91 return __sync_lock_test_and_set_4(pi, i);
95 return __sync_lock_test_and_set(pi, i);
106#define atomic_increment32(pi) _InterlockedIncrement((long *)(pi))
110inline ::i32 atomic_increment32(::i32* pi)
113#if defined(RASPBERRYPIOS) && defined(OS32BIT)
115 return __sync_add_and_fetch_4(pi, 1);
119 return __sync_add_and_fetch(pi, 1);
131 #define atomic_decrement64(pi) _interlockeddecrement64((::i64 *)(pi))
135 inline ::i64 atomic_decrement64(::i64 * pi)
138#if defined(RASPBERRYPIOS) && defined(OS32BIT)
140 return __sync_sub_and_fetch_4(pi, 1);
144 return __sync_sub_and_fetch(pi, 1);
155 #define atomic_decrement32(pi) _InterlockedDecrement((long*)(pi))
159 inline ::i32 atomic_decrement32(::i32 * pi)
162#if defined(RASPBERRYPIOS) && defined(OS32BIT)
164 return __sync_sub_and_fetch_4(pi, 1);
168 return __sync_sub_and_fetch(pi, 1);
180 #define atomic_add64(pi, i) _interlockedadd64((::i64 *)(pi),(::i64) (i))
184inline ::i64 atomic_add64(::i64* pi, ::i64 i)
187#if defined(RASPBERRYPIOS) && defined(OS32BIT)
189 return __sync_add_and_fetch_4(pi, 1);
193 return __sync_add_and_fetch(pi, i);
205 #define atomic_add32(pi, i) _interlockedadd((long *)(pi),(long) (i))
209inline ::i32 atomic_add32(::i32* pi, ::i32 i)
212#if defined(RASPBERRYPIOS) && defined(OS32BIT)
214 return __sync_add_and_fetch_4(pi, 1);
218 return __sync_add_and_fetch(pi, i);
230#define atomic_subtract64(pi, i) _interlockedadd64((::i64 *)(pi), (::i64) (-(i)))
234 inline ::i64 atomic_subtract64(::i64* pi, ::i64 i)
237#if defined(RASPBERRYPIOS) && defined(OS32BIT)
239 return __sync_sub_and_fetch_4(pi, 1);
243 return __sync_sub_and_fetch(pi, i);
255#define atomic_subtract32(pi, i) _interlockedadd((long*)(pi), (long)(-(i)))
259inline ::i32 atomic_subtract32(::i32* pi, ::i32 i)
262#if defined(RASPBERRYPIOS) && defined(OS32BIT)
264 return __sync_sub_and_fetch_4(pi, 1);
268 return __sync_sub_and_fetch(pi, i);