1/* 2 * Copyright 2003, Marcus Overhagen. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7#include <SupportDefs.h> 8 9#include <syscalls.h> 10 11 12#ifdef ATOMIC_FUNCS_ARE_SYSCALLS 13 14void 15atomic_set(int32 *value, int32 newValue) 16{ 17 _kern_atomic_set(value, newValue); 18} 19 20 21int32 22atomic_get_and_set(int32 *value, int32 newValue) 23{ 24 return _kern_atomic_get_and_set(value, newValue); 25} 26 27 28int32 29atomic_test_and_set(int32 *value, int32 newValue, int32 testAgainst) 30{ 31 return _kern_atomic_test_and_set(value, newValue, testAgainst); 32} 33 34 35int32 36atomic_add(int32 *value, int32 addValue) 37{ 38 return _kern_atomic_add(value, addValue); 39} 40 41 42int32 43atomic_and(int32 *value, int32 andValue) 44{ 45 return _kern_atomic_and(value, andValue); 46} 47 48 49int32 50atomic_or(int32 *value, int32 orValue) 51{ 52 return _kern_atomic_or(value, orValue); 53} 54 55 56int32 57atomic_get(int32 *value) 58{ 59 return _kern_atomic_get(value); 60} 61 62 63#endif /* ATOMIC_FUNCS_ARE_SYSCALLS */ 64 65#ifdef ATOMIC64_FUNCS_ARE_SYSCALLS 66 67void 68atomic_set64(int64 *value, int64 newValue) 69{ 70 _kern_atomic_set64(value, newValue); 71} 72 73 74int64 75atomic_test_and_set64(int64 *value, int64 newValue, int64 testAgainst) 76{ 77 return _kern_atomic_test_and_set64(value, newValue, testAgainst); 78} 79 80 81int64 82atomic_add64(int64 *value, int64 addValue) 83{ 84 return _kern_atomic_add64(value, addValue); 85} 86 87 88int64 89atomic_and64(int64 *value, int64 andValue) 90{ 91 return _kern_atomic_and64(value, andValue); 92} 93 94 95int64 96atomic_or64(int64 *value, int64 orValue) 97{ 98 return _kern_atomic_or64(value, orValue); 99} 100 101 102int64 103atomic_get64(int64 *value) 104{ 105 return _kern_atomic_get64(value); 106} 107 108 109#endif /* ATOMIC64_FUNCS_ARE_SYSCALLS */ 110 111#if defined(__arm__) && !defined(__clang__) 112 113/* GCC compatibility: libstdc++ needs this one. 114 * TODO: Update libstdc++ and drop this. 115 * cf. http://fedoraproject.org/wiki/Architectures/ARM/GCCBuiltInAtomicOperations 116 */ 117extern int32_t __sync_fetch_and_add_4(int32_t *value, int32_t addValue); 118 119extern int32_t __sync_fetch_and_add_4(int32_t *value, int32_t addValue) 120{ 121 return atomic_add((int32 *)value, addValue); 122} 123 124#endif 125