On Friday 09 September 2011 12:22:28 pm Konstantin Tokarev wrote: > With new build: > > $ bin/java -jar demo/jfc/FileChooserDemo/FileChooserDemo.jar > Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=on -Djava.awt.headless= > # > # A fatal error has been detected by the Java Runtime Environment: > # > # Internal Error (os_bsd_zero.cpp:266), pid=49359, tid=4041822208 > # fatal error: caught unhandled signal 10 at address 0x0 > # > # JRE version: 7.0 > # Java VM: OpenJDK Zero VM (21.0-b17 interpreted mode bsd-ppc ) > # Failed to write core dump. Core dumps have been disabled. To enable core > dumping, try "ulimit -c unlimited" before starting Java again > # > # An error report file with more information is saved as: > # > /Volumes/Development/src/java/openjdk7-macppc-fcs-2011-09-09/hs_err_pid49359.log > Exception in thread "Basic L&F File Loading Thread" > java.lang.ArrayStoreException > at java.lang.System.arraycopy(Native Method) > at java.lang.String.getChars(String.java:863) > at > java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:416) > at java.lang.StringBuilder.append(StringBuilder.java:132) > at java.io.UnixFileSystem.resolve(UnixFileSystem.java:108) > at java.io.File.<init>(File.java:236) > at java.io.File.listFiles(File.java:1138) > at sun.awt.shell.ShellFolder.listFiles(ShellFolder.java:125) > at > javax.swing.filechooser.FileSystemView.getFiles(FileSystemView.java:474) > at > javax.swing.plaf.basic.BasicDirectoryModel$LoadFilesThread.run0(BasicDirectoryModel.java:239) > at > javax.swing.plaf.basic.BasicDirectoryModel$LoadFilesThread.run(BasicDirectoryModel.java:228) > > > The same jar works fine with 2011-02-12 build. Log is attached.
This is working ok for me, however I have only one CPU. The February builds also included some atomic operations diffs I was working on to fix SMP. I left them out of this build because I wanted to release a build that exactly matched the committed bsd-port. Please try a build with the attached diff to see if that helps corrects this problem. Thanks, -Kurt
diff -r 3406145981b7 src/os_cpu/bsd_zero/vm/atomic_bsd_zero.inline.hpp --- a/src/os_cpu/bsd_zero/vm/atomic_bsd_zero.inline.hpp Thu Jul 07 23:49:21 2011 -0700 +++ b/src/os_cpu/bsd_zero/vm/atomic_bsd_zero.inline.hpp Thu Sep 08 14:29:51 2011 -0400 @@ -31,470 +31,173 @@ #include "runtime/os.hpp" #include "vm_version_zero.hpp" -#include <sys/types.h> -#ifdef __NetBSD__ -#include <sys/atomic.h> -#elif __FreeBSD__ +// Implementation of class atomic -#include <sys/types.h> -#ifndef SPARC -#include <machine/atomic.h> -#else +#ifdef M68K /* - * On FreeBSD/sparc64, <machine/atomic.h> pulls in <machine/cpufunc.h> - * which includes definitions which cause conflicts with various - * definitions within HotSpot source. To avoid that, pull in those - * definitions verbatim instead of including the header. Yuck. - */ - -/*- - * Copyright (c) 1998 Doug Rabson. - * Copyright (c) 2001 Jake Burkholder. - * All rights reserved. + * __m68k_cmpxchg * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. + * Atomically store newval in *ptr if *ptr is equal to oldval for user space. + * Returns newval on success and oldval if no exchange happened. + * This implementation is processor specific and works on + * 68020 68030 68040 and 68060. * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * It will not work on ColdFire, 68000 and 68010 since they lack the CAS + * instruction. + * Using a kernelhelper would be better for arch complete implementation. * */ -#include <machine/asi.h> +static inline int __m68k_cmpxchg(int oldval, int newval, volatile int *ptr) { + int ret; + __asm __volatile ("cas%.l %0,%2,%1" + : "=d" (ret), "+m" (*(ptr)) + : "d" (newval), "0" (oldval)); + return ret; +} + +/* Perform an atomic compare and swap: if the current value of `*PTR' + is OLDVAL, then write NEWVAL into `*PTR'. Return the contents of + `*PTR' before the operation.*/ +static inline int m68k_compare_and_swap(volatile int *ptr, + int oldval, + int newval) { + for (;;) { + int prev = *ptr; + if (prev != oldval) + return prev; + + if (__m68k_cmpxchg (prev, newval, ptr) == newval) + // Success. + return prev; + + // We failed even though prev == oldval. Try again. + } +} + +/* Atomically add an int to memory. */ +static inline int m68k_add_and_fetch(volatile int *ptr, int add_value) { + for (;;) { + // Loop until success. + + int prev = *ptr; + + if (__m68k_cmpxchg (prev, prev + add_value, ptr) == prev + add_value) + return prev + add_value; + } +} + +/* Atomically write VALUE into `*PTR' and returns the previous + contents of `*PTR'. */ +static inline int m68k_lock_test_and_set(volatile int *ptr, int newval) { + for (;;) { + // Loop until success. + int prev = *ptr; + + if (__m68k_cmpxchg (prev, newval, ptr) == prev) + return prev; + } +} +#endif // M68K + +#ifdef ARM /* - * Membar operand macros for use in other macros when # is a special - * character. Keep these in sync with what the hardware expects. - */ -#define M_LoadLoad (0) -#define M_StoreLoad (1) -#define M_LoadStore (2) -#define M_StoreStore (3) - -#define CMASK_SHIFT (4) -#define MMASK_SHIFT (0) - -#define CMASK_GEN(bit) ((1 << (bit)) << CMASK_SHIFT) -#define MMASK_GEN(bit) ((1 << (bit)) << MMASK_SHIFT) - -#define LoadLoad MMASK_GEN(M_LoadLoad) -#define StoreLoad MMASK_GEN(M_StoreLoad) -#define LoadStore MMASK_GEN(M_LoadStore) -#define StoreStore MMASK_GEN(M_StoreStore) - -#define casa(rs1, rs2, rd, asi) ({ \ - u_int __rd = (uint32_t)(rd); \ - __asm __volatile("casa [%2] %3, %4, %0" \ - : "+r" (__rd), "=m" (*rs1) \ - : "r" (rs1), "n" (asi), "r" (rs2), "m" (*rs1)); \ - __rd; \ -}) - -#define casxa(rs1, rs2, rd, asi) ({ \ - u_long __rd = (uint64_t)(rd); \ - __asm __volatile("casxa [%2] %3, %4, %0" \ - : "+r" (__rd), "=m" (*rs1) \ - : "r" (rs1), "n" (asi), "r" (rs2), "m" (*rs1)); \ - __rd; \ -}) - -#define membar(mask) do { \ - __asm __volatile("membar %0" : : "n" (mask) : "memory"); \ -} while (0) - -#ifdef _KERNEL -#define __ASI_ATOMIC ASI_N -#else -#define __ASI_ATOMIC ASI_P -#endif - -#define mb() __asm__ __volatile__ ("membar #MemIssue": : :"memory") -#define wmb() mb() -#define rmb() mb() - -/* - * Various simple arithmetic on memory which is atomic in the presence - * of interrupts and multiple processors. See atomic(9) for details. - * Note that efficient hardware support exists only for the 32 and 64 - * bit variants; the 8 and 16 bit versions are not provided and should - * not be used in MI code. + * __kernel_cmpxchg * - * This implementation takes advantage of the fact that the sparc64 - * cas instruction is both a load and a store. The loop is often coded - * as follows: + * Atomically store newval in *ptr if *ptr is equal to oldval for user space. + * Return zero if *ptr was changed or non-zero if no exchange happened. + * The C flag is also set if *ptr was changed to allow for assembly + * optimization in the calling code. * - * do { - * expect = *p; - * new = expect + 1; - * } while (cas(p, expect, new) != expect); - * - * which performs an unnnecessary load on each iteration that the cas - * operation fails. Modified as follows: - * - * expect = *p; - * for (;;) { - * new = expect + 1; - * result = cas(p, expect, new); - * if (result == expect) - * break; - * expect = result; - * } - * - * the return value of cas is used to avoid the extra reload. - * - * The memory barriers provided by the acq and rel variants are intended - * to be sufficient for use of relaxed memory ordering. Due to the - * suggested assembly syntax of the membar operands containing a # - * character, they cannot be used in macros. The cmask and mmask bits - * are hard coded in machine/cpufunc.h and used here through macros. - * Hopefully sun will choose not to change the bit numbers. */ -#define itype(sz) uint ## sz ## _t +typedef int (__kernel_cmpxchg_t)(int oldval, int newval, volatile int *ptr); +#define __kernel_cmpxchg (*(__kernel_cmpxchg_t *) 0xffff0fc0) -#define atomic_cas_32(p, e, s) casa(p, e, s, __ASI_ATOMIC) -#define atomic_cas_64(p, e, s) casxa(p, e, s, __ASI_ATOMIC) -#define atomic_cas(p, e, s, sz) \ - atomic_cas_ ## sz(p, e, s) -#define atomic_cas_acq(p, e, s, sz) ({ \ - itype(sz) v; \ - v = atomic_cas(p, e, s, sz); \ - membar(LoadLoad | LoadStore); \ - v; \ -}) +/* Perform an atomic compare and swap: if the current value of `*PTR' + is OLDVAL, then write NEWVAL into `*PTR'. Return the contents of + `*PTR' before the operation.*/ +static inline int arm_compare_and_swap(volatile int *ptr, + int oldval, + int newval) { + for (;;) { + int prev = *ptr; + if (prev != oldval) + return prev; -#define atomic_cas_rel(p, e, s, sz) ({ \ - itype(sz) v; \ - membar(LoadStore | StoreStore); \ - v = atomic_cas(p, e, s, sz); \ - v; \ -}) + if (__kernel_cmpxchg (prev, newval, ptr) == 0) + // Success. + return prev; -#define atomic_op(p, op, v, sz) ({ \ - itype(sz) e, r, s; \ - for (e = *(volatile itype(sz) *)p;; e = r) { \ - s = e op v; \ - r = atomic_cas_ ## sz(p, e, s); \ - if (r == e) \ - break; \ - } \ - e; \ -}) - -#define atomic_op_acq(p, op, v, sz) ({ \ - itype(sz) t; \ - t = atomic_op(p, op, v, sz); \ - membar(LoadLoad | LoadStore); \ - t; \ -}) - -#define atomic_op_rel(p, op, v, sz) ({ \ - itype(sz) t; \ - membar(LoadStore | StoreStore); \ - t = atomic_op(p, op, v, sz); \ - t; \ -}) - -#define atomic_load(p, sz) \ - atomic_cas(p, 0, 0, sz) - -#define atomic_load_acq(p, sz) ({ \ - itype(sz) v; \ - v = atomic_load(p, sz); \ - membar(LoadLoad | LoadStore); \ - v; \ -}) - -#define atomic_load_clear(p, sz) ({ \ - itype(sz) e, r; \ - for (e = *(volatile itype(sz) *)p;; e = r) { \ - r = atomic_cas(p, e, 0, sz); \ - if (r == e) \ - break; \ - } \ - e; \ -}) - -#define atomic_store(p, v, sz) do { \ - itype(sz) e, r; \ - for (e = *(volatile itype(sz) *)p;; e = r) { \ - r = atomic_cas(p, e, v, sz); \ - if (r == e) \ - break; \ - } \ -} while (0) - -#define atomic_store_rel(p, v, sz) do { \ - membar(LoadStore | StoreStore); \ - atomic_store(p, v, sz); \ -} while (0) - -#define ATOMIC_GEN(name, ptype, vtype, atype, sz) \ - \ -static __inline vtype \ -atomic_add_ ## name(volatile ptype p, atype v) \ -{ \ - return ((vtype)atomic_op(p, +, v, sz)); \ -} \ -static __inline vtype \ -atomic_add_acq_ ## name(volatile ptype p, atype v) \ -{ \ - return ((vtype)atomic_op_acq(p, +, v, sz)); \ -} \ -static __inline vtype \ -atomic_add_rel_ ## name(volatile ptype p, atype v) \ -{ \ - return ((vtype)atomic_op_rel(p, +, v, sz)); \ -} \ - \ -static __inline int \ -atomic_cmpset_ ## name(volatile ptype p, vtype e, vtype s) \ -{ \ - return (((vtype)atomic_cas(p, e, s, sz)) == e); \ -} \ -static __inline int \ -atomic_cmpset_acq_ ## name(volatile ptype p, vtype e, vtype s) \ -{ \ - return (((vtype)atomic_cas_acq(p, e, s, sz)) == e); \ -} \ -static __inline int \ -atomic_cmpset_rel_ ## name(volatile ptype p, vtype e, vtype s) \ -{ \ - return (((vtype)atomic_cas_rel(p, e, s, sz)) == e); \ -} \ - \ -static __inline vtype \ -atomic_load_ ## name(volatile ptype p) \ -{ \ - return ((vtype)atomic_cas(p, 0, 0, sz)); \ -} \ -static __inline vtype \ -atomic_load_acq_ ## name(volatile ptype p) \ -{ \ - return ((vtype)atomic_cas_acq(p, 0, 0, sz)); \ -} \ - \ -static __inline void \ -atomic_store_ ## name(volatile ptype p, vtype v) \ -{ \ - atomic_store(p, v, sz); \ -} \ -static __inline void \ -atomic_store_rel_ ## name(volatile ptype p, vtype v) \ -{ \ - atomic_store_rel(p, v, sz); \ + // We failed even though prev == oldval. Try again. + } } -inline jlong Atomic::load(volatile jlong* src) { - volatile jlong dest; - os::atomic_copy64(src, &dest); - return dest; +/* Atomically add an int to memory. */ +static inline int arm_add_and_fetch(volatile int *ptr, int add_value) { + for (;;) { + // Loop until a __kernel_cmpxchg succeeds. + + int prev = *ptr; + + if (__kernel_cmpxchg (prev, prev + add_value, ptr) == 0) + return prev + add_value; + } } -inline void Atomic::store(jlong store_value, jlong* dest) { - os::atomic_copy64((volatile jlong*)&store_value, (volatile jlong*)dest); +/* Atomically write VALUE into `*PTR' and returns the previous + contents of `*PTR'. */ +static inline int arm_lock_test_and_set(volatile int *ptr, int newval) { + for (;;) { + // Loop until a __kernel_cmpxchg succeeds. + int prev = *ptr; + + if (__kernel_cmpxchg (prev, newval, ptr) == 0) + return prev; + } } - -inline void Atomic::store(jlong store_value, volatile jlong* dest) { - os::atomic_copy64((volatile jlong*)&store_value, dest); -} - -ATOMIC_GEN(int, u_int *, u_int, u_int, 32); -ATOMIC_GEN(32, uint32_t *, uint32_t, uint32_t, 32); - -ATOMIC_GEN(long, u_long *, u_long, u_long, 64); -ATOMIC_GEN(64, uint64_t *, uint64_t, uint64_t, 64); - -ATOMIC_GEN(ptr, uintptr_t *, uintptr_t, uintptr_t, 64); - -#define atomic_fetchadd_int atomic_add_int -#define atomic_fetchadd_32 atomic_add_32 -#define atomic_fetchadd_long atomic_add_long - -#undef ATOMIC_GEN -#undef atomic_cas -#undef atomic_cas_acq -#undef atomic_cas_rel -#undef atomic_op -#undef atomic_op_acq -#undef atomic_op_rel -#undef atomic_load_acq -#undef atomic_store_rel -#undef atomic_load_clear -#endif - -static __inline __attribute__((__always_inline__)) -unsigned int atomic_add_int_nv(volatile unsigned int* dest, unsigned int add_value) -{ - atomic_add_acq_int(dest, add_value); - return *dest; -} - -static __inline __attribute__((__always_inline__)) -uintptr_t atomic_add_ptr_nv(volatile intptr_t* dest, intptr_t add_value) -{ - atomic_add_acq_ptr((volatile uintptr_t*) dest, (uintptr_t) add_value); - return *((volatile uintptr_t*) dest); -} - -static __inline __attribute__((__always_inline__)) -unsigned int -atomic_swap_uint(volatile unsigned int *dest, unsigned int exchange_value) -{ - jint prev = *dest; - atomic_store_rel_int(dest, exchange_value); - return prev; -} - -static __inline __attribute__((__always_inline__)) -void * -atomic_swap_ptr(volatile void *dest, void *exchange_value) -{ - void *prev = *(void **)dest; - atomic_store_rel_ptr((volatile uintptr_t*) dest, (uintptr_t) exchange_value); - return prev; -} - -static __inline __attribute__((__always_inline__)) -unsigned int -atomic_cas_uint(volatile unsigned int *dest, unsigned int compare_value, - unsigned int exchange_value) -{ - unsigned int prev = *dest; - atomic_cmpset_acq_int(dest, compare_value, exchange_value); - return prev; -} - -static __inline __attribute__((__always_inline__)) -unsigned long -atomic_cas_ulong(volatile unsigned long *dest, unsigned long compare_value, - unsigned long exchange_value) -{ - unsigned long prev = *dest; - atomic_cmpset_acq_long(dest, compare_value, exchange_value); - return prev; -} - -static __inline __attribute__((__always_inline__)) -void * -atomic_cas_ptr(volatile void *dest, void *compare_value, void *exchange_value) -{ - void *prev = *(void **)dest; - atomic_cmpset_acq_ptr((volatile uintptr_t*) dest, (uintptr_t) compare_value, (uintptr_t) exchange_value); - return prev; -} - -#elif defined(__APPLE__) - -#include <libkern/OSAtomic.h> - -static __inline __attribute__((__always_inline__)) -unsigned int -atomic_add_int_nv(volatile unsigned int *target, int delta) { - return (unsigned int) OSAtomicAdd32Barrier(delta, (volatile int32_t *) target); -} - -static __inline __attribute__((__always_inline__)) -void * -atomic_add_ptr_nv(volatile void *target, ssize_t delta) { -#ifdef __LP64__ - return (void *) OSAtomicAdd64Barrier(delta, (volatile int64_t *) target); -#else - return (void *) OSAtomicAdd32Barrier(delta, (volatile int32_t *) target); -#endif -} - - -static __inline __attribute__((__always_inline__)) -unsigned int -atomic_swap_uint(volatile unsigned int *dest, unsigned int exchange_value) -{ - /* No xchg support in OSAtomic */ - unsigned int prev; - do { - prev = *dest; - } while (!OSAtomicCompareAndSwapIntBarrier((int) prev, (int) exchange_value, (volatile int *) dest)); - - return prev; -} - -static __inline __attribute__((__always_inline__)) -void * -atomic_swap_ptr(volatile void *dest, void *exchange_value) -{ - /* No xchg support in OSAtomic */ - void *prev; - do { - prev = *((void * volatile *) dest); - } while (!OSAtomicCompareAndSwapPtrBarrier(prev, exchange_value, (void * volatile *) dest)); - - return prev; -} - -static __inline __attribute__((__always_inline__)) -unsigned int -atomic_cas_uint(volatile unsigned int *dest, unsigned int compare_value, - unsigned int exchange_value) -{ - unsigned int prev = *dest; - OSAtomicCompareAndSwapIntBarrier(compare_value, exchange_value, (volatile int *) dest); - return prev; -} - -static __inline __attribute__((__always_inline__)) -unsigned long -atomic_cas_ulong(volatile unsigned long *dest, unsigned long compare_value, - unsigned long exchange_value) -{ - unsigned long prev = *dest; - OSAtomicCompareAndSwapLongBarrier(compare_value, exchange_value, (volatile long *) dest); - return prev; -} - -static __inline __attribute__((__always_inline__)) -void * -atomic_cas_ptr(volatile void *dest, void *compare_value, void *exchange_value) -{ - void *prev = *(void **)dest; - OSAtomicCompareAndSwapPtrBarrier(compare_value, exchange_value, (void * volatile *) dest); - return prev; -} - - -#endif +#endif // ARM inline void Atomic::store(jint store_value, volatile jint* dest) { +#if !defined(ARM) && !defined(M68K) + __sync_synchronize(); +#endif *dest = store_value; } inline void Atomic::store_ptr(intptr_t store_value, intptr_t* dest) { +#if !defined(ARM) && !defined(M68K) + __sync_synchronize(); +#endif *dest = store_value; } inline jint Atomic::add(jint add_value, volatile jint* dest) { - return (jint)atomic_add_int_nv((volatile unsigned int*) dest, add_value); +#ifdef ARM + return arm_add_and_fetch(dest, add_value); +#elif defined(M68K) + return m68k_add_and_fetch(dest, add_value); +#elif defined(PPC) + return __sync_add_and_fetch(dest, add_value); +#else + return __sync_add_and_fetch(dest, add_value); +#endif } inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) { - return (intptr_t)atomic_add_ptr_nv(dest, add_value); +#ifdef ARM + return arm_add_and_fetch(dest, add_value); +#elif defined(M68K) + return m68k_add_and_fetch(dest, add_value); +#elif defined(PPC) + return __sync_add_and_fetch(dest, add_value); +#else + return __sync_add_and_fetch(dest, add_value); +#endif } inline void* Atomic::add_ptr(intptr_t add_value, volatile void* dest) { @@ -526,43 +229,95 @@ } inline jint Atomic::xchg(jint exchange_value, volatile jint* dest) { - return (jint)atomic_swap_uint((volatile u_int *)dest, (u_int)exchange_value); +#ifdef ARM + return arm_lock_test_and_set(dest, exchange_value); +#elif defined(M68K) + return m68k_lock_test_and_set(dest, exchange_value); +#elif defined(PPC) + return __sync_lock_test_and_set (dest, exchange_value); +#else + // __sync_lock_test_and_set is a bizarrely named atomic exchange + // operation. Note that some platforms only support this with the + // limitation that the only valid value to store is the immediate + // constant 1. There is a test for this in JNI_CreateJavaVM(). + return __sync_lock_test_and_set (dest, exchange_value); +#endif } inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t* dest) { - return (intptr_t)atomic_swap_ptr((volatile void *)dest, - (void *)exchange_value); +#ifdef ARM + return arm_lock_test_and_set(dest, exchange_value); +#elif defined(M68K) + return m68k_lock_test_and_set(dest, exchange_value); +#elif defined(PPC) + return __sync_lock_test_and_set (dest, exchange_value); +#else + return __sync_lock_test_and_set (dest, exchange_value); +#endif } inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) { - return atomic_swap_ptr(dest, exchange_value); + return (void *) xchg_ptr((intptr_t) exchange_value, + (volatile intptr_t*) dest); } inline jint Atomic::cmpxchg(jint exchange_value, volatile jint* dest, jint compare_value) { - return atomic_cas_uint((volatile u_int *)dest, compare_value, exchange_value); +#ifdef ARM + return arm_compare_and_swap(dest, compare_value, exchange_value); +#elif defined(M68K) + return m68k_compare_and_swap(dest, compare_value, exchange_value); +#elif defined(PPC) + return __sync_val_compare_and_swap(dest, compare_value, exchange_value); +#else + return __sync_val_compare_and_swap(dest, compare_value, exchange_value); +#endif } inline jlong Atomic::cmpxchg(jlong exchange_value, volatile jlong* dest, jlong compare_value) { - return atomic_cas_ulong((volatile u_long *)dest, compare_value, - exchange_value); + + return __sync_val_compare_and_swap(dest, compare_value, exchange_value); } inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value) { - return (intptr_t)atomic_cas_ptr((volatile void *)dest, (void *)compare_value, - (void *)exchange_value); +#ifdef ARM + return arm_compare_and_swap(dest, compare_value, exchange_value); +#elif defined(M68K) + return m68k_compare_and_swap(dest, compare_value, exchange_value); +#elif defined(PPC) + return __sync_val_compare_and_swap(dest, compare_value, exchange_value); +#else + return __sync_val_compare_and_swap(dest, compare_value, exchange_value); +#endif } inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value) { - return atomic_cas_ptr((volatile void *)dest, compare_value, exchange_value); + + return (void *) cmpxchg_ptr((intptr_t) exchange_value, + (volatile intptr_t*) dest, + (intptr_t) compare_value); +} + +inline jlong Atomic::load(volatile jlong* src) { + volatile jlong dest; + os::atomic_copy64(src, &dest); + return dest; +} + +inline void Atomic::store(jlong store_value, jlong* dest) { + os::atomic_copy64((volatile jlong*)&store_value, (volatile jlong*)dest); +} + +inline void Atomic::store(jlong store_value, volatile jlong* dest) { + os::atomic_copy64((volatile jlong*)&store_value, dest); } #endif // OS_CPU_BSD_ZERO_VM_ATOMIC_BSD_ZERO_INLINE_HPP diff -r 3406145981b7 src/os_cpu/bsd_zero/vm/orderAccess_bsd_zero.inline.hpp --- a/src/os_cpu/bsd_zero/vm/orderAccess_bsd_zero.inline.hpp Thu Jul 07 23:49:21 2011 -0700 +++ b/src/os_cpu/bsd_zero/vm/orderAccess_bsd_zero.inline.hpp Thu Sep 08 14:29:51 2011 -0400 @@ -44,32 +44,25 @@ #define READ_MEM_BARRIER __kernel_dmb() #define WRITE_MEM_BARRIER __kernel_dmb() -#else // ARM +#elif defined(PPC) -#ifdef __APPLE__ -#include <libkern/OSAtomic.h> -#define FULL_MEM_BARRIER OSMemoryBarrier() -#else -#define FULL_MEM_BARRIER __sync_synchronize() -#endif // __APPLE__ +#define FULL_MEM_BARRIER __asm __volatile ("isync; sync":::"memory") -#ifdef PPC - -#define READ_MEM_BARRIER __asm __volatile ("isync":::"memory") #ifdef __NO_LWSYNC__ +#define READ_MEM_BARRIER __asm __volatile ("sync":::"memory") #define WRITE_MEM_BARRIER __asm __volatile ("sync":::"memory") #else +#define READ_MEM_BARRIER __asm __volatile ("lwsync":::"memory") #define WRITE_MEM_BARRIER __asm __volatile ("lwsync":::"memory") #endif -#else // PPC +#else +#define FULL_MEM_BARRIER __sync_synchronize() #define READ_MEM_BARRIER __asm __volatile ("":::"memory") #define WRITE_MEM_BARRIER __asm __volatile ("":::"memory") -#endif // PPC - -#endif // ARM +#endif inline void OrderAccess::loadload() { acquire(); }