#include <urcu/compiler.h>
#include <urcu/system.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
#ifndef __SIZEOF_LONG__
-#if (defined(__sparc_v8__) || defined(__sparc_v9__))
+#ifdef __LP64__
#define __SIZEOF_LONG__ 8
#else
#define __SIZEOF_LONG__ 4
#define BITS_PER_LONG (__SIZEOF_LONG__ * 8)
#endif
-#define uatomic_set(addr, v) STORE_SHARED(*(addr), (v))
-#define uatomic_read(addr) LOAD_SHARED(*(addr))
-
/* cmpxchg */
static inline __attribute__((always_inline))
switch (len) {
case 4:
{
- unsigned int old;
+ unsigned int old, oldt;
- oldt = uatomic_read(addr);
+ oldt = uatomic_read((unsigned int *)addr);
do {
old = oldt;
oldt = _uatomic_cmpxchg(addr, old, val, 4);
#if (BITS_PER_LONG == 64)
case 8:
{
- unsigned long old;
+ unsigned long old, oldt;
- oldt = uatomic_read(addr);
+ oldt = uatomic_read((unsigned long *)addr);
do {
old = oldt;
oldt = _uatomic_cmpxchg(addr, old, val, 8);
/* uatomic_add_return */
static inline __attribute__((always_inline))
-unsigned long _uatomic_add_return(void *addr, unsigned long val,
- int len)
+unsigned long _uatomic_add_return(void *addr, unsigned long val, int len)
{
switch (len) {
case 4:
{
- unsigned int old;
+ unsigned int old, oldt;
- oldt = uatomic_read(addr);
+ oldt = uatomic_read((unsigned int *)addr);
do {
old = oldt;
oldt = _uatomic_cmpxchg(addr, old, old + val, 4);
#if (BITS_PER_LONG == 64)
case 8:
{
- unsigned long old;
+ unsigned long old, oldt;
- oldt = uatomic_read(addr);
+ oldt = uatomic_read((unsigned long *)addr);
do {
old = oldt;
oldt = _uatomic_cmpxchg(addr, old, old + val, 8);
(unsigned long)(v), \
sizeof(*(addr))))
-/* uatomic_sub_return, uatomic_add, uatomic_sub, uatomic_inc, uatomic_dec */
-
-#define uatomic_sub_return(addr, v) uatomic_add_return((addr), -(v))
-
-#define uatomic_add(addr, v) (void)uatomic_add_return((addr), (v))
-#define uatomic_sub(addr, v) (void)uatomic_sub_return((addr), (v))
-
-#define uatomic_inc(addr) uatomic_add((addr), 1)
-#define uatomic_dec(addr) uatomic_add((addr), -1)
+#ifdef __cplusplus
+}
+#endif
-#define URCU_CAS_AVAIL() 1
-#define compat_uatomic_cmpxchg(ptr, old, _new) uatomic_cmpxchg(ptr, old, _new)
+#include <urcu/uatomic_generic.h>
#endif /* _URCU_ARCH_UATOMIC_PPC_H */