summaryrefslogtreecommitdiff
path: root/src/atomic_counter.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/atomic_counter.hpp')
-rw-r--r--src/atomic_counter.hpp34
1 files changed, 33 insertions, 1 deletions
diff --git a/src/atomic_counter.hpp b/src/atomic_counter.hpp
index 914afdc..07002af 100644
--- a/src/atomic_counter.hpp
+++ b/src/atomic_counter.hpp
@@ -1,7 +1,7 @@
/*
Copyright (c) 2009-2012 250bpm s.r.o.
Copyright (c) 2007-2009 iMatix Corporation
- Copyright (c) 2007-2011 Other contributors as noted in the AUTHORS file
+ Copyright (c) 2007-2012 Other contributors as noted in the AUTHORS file
This file is part of Crossroads I/O project.
@@ -29,6 +29,8 @@
#define XS_ATOMIC_COUNTER_MUTEX
#elif (defined __i386__ || defined __x86_64__) && defined __GNUC__
#define XS_ATOMIC_COUNTER_X86
+#elif defined __ARM_ARCH_7A__ && defined __GNUC__
+#define XS_ATOMIC_COUNTER_ARM
#elif defined XS_HAVE_WINDOWS
#define XS_ATOMIC_COUNTER_WINDOWS
#elif (defined XS_HAVE_SOLARIS || defined XS_HAVE_NETBSD)
@@ -88,6 +90,19 @@ namespace xs
: "=r" (old_value), "=m" (value)
: "0" (increment_), "m" (value)
: "cc", "memory");
+#elif defined XS_ATOMIC_COUNTER_ARM
+ integer_t flag, tmp;
+ __asm__ volatile (
+ " dmb sy\n\t"
+ "1: ldrex %0, [%5]\n\t"
+ " add %2, %0, %4\n\t"
+ " strex %1, %2, [%5]\n\t"
+ " teq %1, #0\n\t"
+ " bne 1b\n\t"
+ " dmb sy\n\t"
+ : "=&r"(old_value), "=&r"(flag), "=&r"(tmp), "+Qo"(value)
+ : "Ir"(increment_), "r"(&value)
+ : "cc");
#elif defined XS_ATOMIC_COUNTER_MUTEX
sync.lock ();
old_value = value;
@@ -118,6 +133,20 @@ namespace xs
: "0" (oldval), "m" (*val)
: "cc", "memory");
return oldval != decrement;
+#elif defined XS_ATOMIC_COUNTER_ARM
+ integer_t old_value, flag, tmp;
+ __asm__ volatile (
+ " dmb sy\n\t"
+ "1: ldrex %0, [%5]\n\t"
+ " sub %2, %0, %4\n\t"
+ " strex %1, %2, [%5]\n\t"
+ " teq %1, #0\n\t"
+ " bne 1b\n\t"
+ " dmb sy\n\t"
+ : "=&r"(old_value), "=&r"(flag), "=&r"(tmp), "+Qo"(value)
+ : "Ir"(decrement), "r"(&value)
+ : "cc");
+ return old_value - decrement != 0;
#elif defined XS_ATOMIC_COUNTER_MUTEX
sync.lock ();
value -= decrement;
@@ -157,6 +186,9 @@ namespace xs
#if defined XS_ATOMIC_COUNTER_X86
#undef XS_ATOMIC_COUNTER_X86
#endif
+#if defined XS_ATOMIC_COUNTER_ARM
+#undef XS_ATOMIC_COUNTER_ARM
+#endif
#if defined XS_ATOMIC_COUNTER_MUTEX
#undef XS_ATOMIC_COUNTER_MUTEX
#endif