]> 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 03:54:23 +0000 (03:54 +0000)
committerMark Andrews <marka@isc.org>
Wed, 14 Oct 2009 03:54:23 +0000 (03:54 +0000)
                        __isync() calls.

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

diff --git a/CHANGES b/CHANGES
index 6a79aa4735512117e0cfb0dafc12f5ec0a7f9248..612ac40df599fda4fbec3a4bc8b03384c4ae9b40 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+2713.  [bug]           powerpc: atomic operations missing asm("ics") /
+                       __isync() calls.
+
        --- 9.7.0b1 released ---
 
 2712.  [func]          New 'auto-dnssec' zone option allows zone signing
index 765cb6d72a8ccbcee04ff090e42de2e0be1a9d80..1e16a681b15d8fcbf6c4c364067c7d8aca99c30c 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.7 2009/10/14 03:54:23 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);
 }