projects
/
cacao.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
* src/native/vm/sun_misc_Unsafe.cpp: Added memory barriers to compare_and_swap.
[cacao.git]
/
src
/
native
/
vm
/
sun_misc_Unsafe.cpp
diff --git
a/src/native/vm/sun_misc_Unsafe.cpp
b/src/native/vm/sun_misc_Unsafe.cpp
index 7e76974657ac41983f55297edf38b74f23e6d9a8..92c68e4e14661046a6c9e50a2395f372dbca3d58 100644
(file)
--- a/
src/native/vm/sun_misc_Unsafe.cpp
+++ b/
src/native/vm/sun_misc_Unsafe.cpp
@@
-1,6
+1,6
@@
/* src/native/vm/sun_misc_Unsafe.cpp - sun/misc/Unsafe
/* src/native/vm/sun_misc_Unsafe.cpp - sun/misc/Unsafe
- Copyright (C) 2006, 2007, 2008, 2009
+ Copyright (C) 2006, 2007, 2008, 2009
, 2010
CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
This file is part of CACAO.
CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
This file is part of CACAO.
@@
-909,6
+909,11
@@
JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_compareAndSwapObject(JNIEnv *env
p = (void **) (((uint8_t *) o) + offset);
result = Atomic::compare_and_swap(p, (void *) expected, (void *) x);
p = (void **) (((uint8_t *) o) + offset);
result = Atomic::compare_and_swap(p, (void *) expected, (void *) x);
+#if defined(CAS_PROVIDES_FULL_BARRIER) && CAS_PROVIDES_FULL_BARRIER
+ Atomic::instruction_barrier();
+#else
+ Atomic::memory_barrier();
+#endif
if (result == expected)
return true;
if (result == expected)
return true;
@@
-932,6
+937,11
@@
JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_compareAndSwapInt(JNIEnv *env, j
p = (uint32_t *) (((uint8_t *) o) + offset);
result = Atomic::compare_and_swap(p, (uint32_t) expected, (uint32_t) x);
p = (uint32_t *) (((uint8_t *) o) + offset);
result = Atomic::compare_and_swap(p, (uint32_t) expected, (uint32_t) x);
+#if defined(CAS_PROVIDES_FULL_BARRIER) && CAS_PROVIDES_FULL_BARRIER
+ Atomic::instruction_barrier();
+#else
+ Atomic::memory_barrier();
+#endif
if (result == (uint32_t) expected)
return true;
if (result == (uint32_t) expected)
return true;
@@
-955,6
+965,11
@@
JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_compareAndSwapLong(JNIEnv *env,
p = (uint64_t *) (((uint8_t *) o) + offset);
result = Atomic::compare_and_swap(p, (uint64_t) expected, (uint64_t) x);
p = (uint64_t *) (((uint8_t *) o) + offset);
result = Atomic::compare_and_swap(p, (uint64_t) expected, (uint64_t) x);
+#if defined(CAS_PROVIDES_FULL_BARRIER) && CAS_PROVIDES_FULL_BARRIER
+ Atomic::instruction_barrier();
+#else
+ Atomic::memory_barrier();
+#endif
if (result == (uint64_t) expected)
return true;
if (result == (uint64_t) expected)
return true;