xref: /haiku/src/system/libroot/os/atomic.c (revision 8f4db360bc74cce76fff614da6ae0332e5fd52a8)
15af32e75SAxel Dörfler /*
25af32e75SAxel Dörfler ** Copyright 2003, Marcus Overhagen. All rights reserved.
35af32e75SAxel Dörfler ** Distributed under the terms of the Haiku 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
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
22*8f4db360SIthamar R. Adema atomic_get_and_set(int32 *value, int32 newValue)
23*8f4db360SIthamar R. Adema {
24*8f4db360SIthamar R. Adema 	return _kern_atomic_get_and_set(value, newValue);
25*8f4db360SIthamar R. Adema }
26*8f4db360SIthamar R. Adema 
27*8f4db360SIthamar R. Adema 
28*8f4db360SIthamar R. Adema int32
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
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
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
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
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
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
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
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
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
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
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 
111f9ab70a1SFrançois Revol #ifdef __ARM__
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 
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