xref: /haiku/src/system/libroot/os/atomic.c (revision 47a21c5c89fc9fd155a3929e5a8f6056b92a2053)
15af32e75SAxel Dörfler /*
2718d7149SJérôme Duval  * Copyright 2003, Marcus Overhagen. All rights reserved.
3*47a21c5cSAugustin Cavalier  * Distributed under the terms of the MIT License.
45af32e75SAxel Dörfler  */
55af32e75SAxel Dörfler 
65af32e75SAxel Dörfler 
75af32e75SAxel Dörfler #include <SupportDefs.h>
85af32e75SAxel Dörfler 
95af32e75SAxel Dörfler #include <syscalls.h>
105af32e75SAxel Dörfler 
115af32e75SAxel Dörfler 
125af32e75SAxel Dörfler #ifdef ATOMIC_FUNCS_ARE_SYSCALLS
135af32e75SAxel Dörfler 
1424f0b1e2SAlexander von Gluck IV void
atomic_set(int32 * value,int32 newValue)1524f0b1e2SAlexander von Gluck IV atomic_set(int32 *value, int32 newValue)
165af32e75SAxel Dörfler {
1724f0b1e2SAlexander von Gluck IV 	_kern_atomic_set(value, newValue);
185af32e75SAxel Dörfler }
195af32e75SAxel Dörfler 
2024f0b1e2SAlexander von Gluck IV 
215af32e75SAxel Dörfler int32
atomic_get_and_set(int32 * value,int32 newValue)228f4db360SIthamar R. Adema atomic_get_and_set(int32 *value, int32 newValue)
238f4db360SIthamar R. Adema {
248f4db360SIthamar R. Adema 	return _kern_atomic_get_and_set(value, newValue);
258f4db360SIthamar R. Adema }
268f4db360SIthamar R. Adema 
278f4db360SIthamar R. Adema 
288f4db360SIthamar R. Adema int32
atomic_test_and_set(int32 * value,int32 newValue,int32 testAgainst)2924f0b1e2SAlexander von Gluck IV atomic_test_and_set(int32 *value, int32 newValue, int32 testAgainst)
305af32e75SAxel Dörfler {
315af32e75SAxel Dörfler 	return _kern_atomic_test_and_set(value, newValue, testAgainst);
325af32e75SAxel Dörfler }
335af32e75SAxel Dörfler 
3424f0b1e2SAlexander von Gluck IV 
355af32e75SAxel Dörfler int32
atomic_add(int32 * value,int32 addValue)3624f0b1e2SAlexander von Gluck IV atomic_add(int32 *value, int32 addValue)
375af32e75SAxel Dörfler {
385af32e75SAxel Dörfler 	return _kern_atomic_add(value, addValue);
395af32e75SAxel Dörfler }
405af32e75SAxel Dörfler 
4124f0b1e2SAlexander von Gluck IV 
425af32e75SAxel Dörfler int32
atomic_and(int32 * value,int32 andValue)4324f0b1e2SAlexander von Gluck IV atomic_and(int32 *value, int32 andValue)
445af32e75SAxel Dörfler {
455af32e75SAxel Dörfler 	return _kern_atomic_and(value, andValue);
465af32e75SAxel Dörfler }
475af32e75SAxel Dörfler 
4824f0b1e2SAlexander von Gluck IV 
495af32e75SAxel Dörfler int32
atomic_or(int32 * value,int32 orValue)5024f0b1e2SAlexander von Gluck IV atomic_or(int32 *value, int32 orValue)
515af32e75SAxel Dörfler {
525af32e75SAxel Dörfler 	return _kern_atomic_or(value, orValue);
535af32e75SAxel Dörfler }
545af32e75SAxel Dörfler 
5524f0b1e2SAlexander von Gluck IV 
565af32e75SAxel Dörfler int32
atomic_get(int32 * value)5724f0b1e2SAlexander von Gluck IV atomic_get(int32 *value)
585af32e75SAxel Dörfler {
595af32e75SAxel Dörfler 	return _kern_atomic_get(value);
605af32e75SAxel Dörfler }
615af32e75SAxel Dörfler 
6224f0b1e2SAlexander von Gluck IV 
635af32e75SAxel Dörfler #endif	/* ATOMIC_FUNCS_ARE_SYSCALLS */
645af32e75SAxel Dörfler 
655af32e75SAxel Dörfler #ifdef ATOMIC64_FUNCS_ARE_SYSCALLS
665af32e75SAxel Dörfler 
6724f0b1e2SAlexander von Gluck IV void
atomic_set64(int64 * value,int64 newValue)6824f0b1e2SAlexander von Gluck IV atomic_set64(int64 *value, int64 newValue)
695af32e75SAxel Dörfler {
7024f0b1e2SAlexander von Gluck IV 	_kern_atomic_set64(value, newValue);
715af32e75SAxel Dörfler }
725af32e75SAxel Dörfler 
7324f0b1e2SAlexander von Gluck IV 
745af32e75SAxel Dörfler int64
atomic_test_and_set64(int64 * value,int64 newValue,int64 testAgainst)7524f0b1e2SAlexander von Gluck IV atomic_test_and_set64(int64 *value, int64 newValue, int64 testAgainst)
765af32e75SAxel Dörfler {
775af32e75SAxel Dörfler 	return _kern_atomic_test_and_set64(value, newValue, testAgainst);
785af32e75SAxel Dörfler }
795af32e75SAxel Dörfler 
8024f0b1e2SAlexander von Gluck IV 
815af32e75SAxel Dörfler int64
atomic_add64(int64 * value,int64 addValue)8224f0b1e2SAlexander von Gluck IV atomic_add64(int64 *value, int64 addValue)
835af32e75SAxel Dörfler {
845af32e75SAxel Dörfler 	return _kern_atomic_add64(value, addValue);
855af32e75SAxel Dörfler }
865af32e75SAxel Dörfler 
8724f0b1e2SAlexander von Gluck IV 
885af32e75SAxel Dörfler int64
atomic_and64(int64 * value,int64 andValue)8924f0b1e2SAlexander von Gluck IV atomic_and64(int64 *value, int64 andValue)
905af32e75SAxel Dörfler {
915af32e75SAxel Dörfler 	return _kern_atomic_and64(value, andValue);
925af32e75SAxel Dörfler }
935af32e75SAxel Dörfler 
9424f0b1e2SAlexander von Gluck IV 
955af32e75SAxel Dörfler int64
atomic_or64(int64 * value,int64 orValue)9624f0b1e2SAlexander von Gluck IV atomic_or64(int64 *value, int64 orValue)
975af32e75SAxel Dörfler {
985af32e75SAxel Dörfler 	return _kern_atomic_or64(value, orValue);
995af32e75SAxel Dörfler }
1005af32e75SAxel Dörfler 
10124f0b1e2SAlexander von Gluck IV 
1025af32e75SAxel Dörfler int64
atomic_get64(int64 * value)10324f0b1e2SAlexander von Gluck IV atomic_get64(int64 *value)
1045af32e75SAxel Dörfler {
1055af32e75SAxel Dörfler 	return _kern_atomic_get64(value);
1065af32e75SAxel Dörfler }
1075af32e75SAxel Dörfler 
10824f0b1e2SAlexander von Gluck IV 
1095af32e75SAxel Dörfler #endif	/* ATOMIC64_FUNCS_ARE_SYSCALLS */
11075453edcSFrançois Revol 
111376472a8SAugustin Cavalier #if defined(__arm__) && !defined(__clang__)
112f9ab70a1SFrançois Revol 
113c436d67dSFrançois Revol /* GCC compatibility: libstdc++ needs this one.
114c436d67dSFrançois Revol  * TODO: Update libstdc++ and drop this.
115c436d67dSFrançois Revol  * cf. http://fedoraproject.org/wiki/Architectures/ARM/GCCBuiltInAtomicOperations
116c436d67dSFrançois Revol  */
117f9ab70a1SFrançois Revol extern int32_t __sync_fetch_and_add_4(int32_t *value, int32_t addValue);
11875453edcSFrançois Revol 
__sync_fetch_and_add_4(int32_t * value,int32_t addValue)11975453edcSFrançois Revol extern int32_t __sync_fetch_and_add_4(int32_t *value, int32_t addValue)
12075453edcSFrançois Revol {
12124f0b1e2SAlexander von Gluck IV 	return atomic_add((int32 *)value, addValue);
12275453edcSFrançois Revol }
123f9ab70a1SFrançois Revol 
124f9ab70a1SFrançois Revol #endif
125