2713. [bug] powerpc: atomic operations missing asm("ics") /

__isync() calls.
This commit is contained in:
Mark Andrews 2009-10-14 03:54:23 +00:00
parent ef9ee92543
commit cbee6197d1
2 changed files with 37 additions and 3 deletions

View file

@ -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

View 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
@ -46,9 +46,33 @@
#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);
}