]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
2713. [bug] powerpc: atomic operations missing asm("ics") /
authorMark Andrews <marka@isc.org>
Wed, 14 Oct 2009 04:00:01 +0000 (04:00 +0000)
committerMark Andrews <marka@isc.org>
Wed, 14 Oct 2009 04:00:01 +0000 (04:00 +0000)
                        __isync() calls.

CHANGES
lib/isc/powerpc/include/isc/atomic.h

diff --git a/CHANGES b/CHANGES
index f0825391eaa0a688dd02053d3416d3e73bb890fb..a5d31ec308c101daf1e4d1fe21e55c515d3afd98 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+2713.  [bug]           powerpc: atomic operations missing asm("ics") /
+                       __isync() calls.
+
 2706.  [bug]           Loading a zone with a very large NSEC3 salt could
                        trigger an assert. [RT #20368]
 
index 765cb6d72a8ccbcee04ff090e42de2e0be1a9d80..c30676c49cb2eba2751079a7eb12051cfab02354 100644 (file)
@@ -14,7 +14,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: atomic.h,v 1.6 2007/06/18 23:47:47 tbox Exp $ */
+/* $Id: atomic.h,v 1.6.332.1 2009/10/14 04:00:01 marka Exp $ */
 
 #ifndef ISC_ATOMIC_H
 #define ISC_ATOMIC_H 1
 
 #include <sys/atomic_op.h>
 
-#define isc_atomic_xadd(p, v) fetch_and_add(p, v)
 #define isc_atomic_store(p, v) _clear_lock(p, v)
 
+#ifdef __GNUC__
+static inline isc_int32_t
+#else
+static isc_int32_t
+#endif
+isc_atomic_xadd(isc_int32_t *p, isc_int32_t val) {
+       int ret;
+
+#ifdef __GNUC__
+        asm("ics");
+#else
+         __isync();
+#endif
+
+       ret = fetch_and_add((atomic_p)p, (int)val);
+
+#ifdef __GNUC__
+        asm("ics");
+#else
+         __isync();
+#endif
+
+        return (ret);
+}
+
 #ifdef __GNUC__
 static inline int
 #else
@@ -63,7 +87,14 @@ isc_atomic_cmpxchg(atomic_p p, int old, int new) {
          __isync();
 #endif
         if (compare_and_swap(p, &orig, new))
-               return (old);
+               orig = old;
+
+#ifdef __GNUC__
+        asm("ics");
+#else
+         __isync();
+#endif
+
         return (orig);
 }