[ecj] More sun.misc.Unsafe stuff

Andrew Haley aph@redhat.com
Fri Sep 29 14:48:00 GMT 2006


Mostly self explanatory. We have to use full memory barriers in a few
places because Java's volatile semantics are more rigorous than those
of C.
Andrew.
2006年09月29日 Andrew Haley <aph@redhat.com>
	* sun/misc/natUnsafe.cc (putOrderedInt): Make reference volatile.
	(putOrderedLong): Likewise.
	(putOrderedObject): Likewise.
	(putIntVolatile): Make reference volatile and insert full barrier.
	(putLongVolatile): Likewise.
	(putObjectVolatile): Likewise.
	(getIntVolatile): Likewise.
	(getObjectVolatile): Likewise.
	(getLongVolatile): Likewise.
Index: natUnsafe.cc
===================================================================
--- natUnsafe.cc	(revision 116896)
+++ natUnsafe.cc	(working copy)
@@ -62,42 +62,45 @@
 void
 sun::misc::Unsafe::putOrderedInt (jobject obj, jlong offset, jint value)
 {
- jint *addr = (jint *) ((char *) obj + offset);
+ volatile jint *addr = (jint *) ((char *) obj + offset);
 *addr = value;
 }
 
 void
 sun::misc::Unsafe::putOrderedLong (jobject obj, jlong offset, jlong value)
 {
- jlong *addr = (jlong *) ((char *) obj + offset);
+ volatile jlong *addr = (jlong *) ((char *) obj + offset);
 *addr = value;
 }
 
 void
 sun::misc::Unsafe::putOrderedObject (jobject obj, jlong offset, jobject value)
 {
- jobject *addr = (jobject *) ((char *) obj + offset);
+ volatile jobject *addr = (jobject *) ((char *) obj + offset);
 *addr = value;
 }
 
 void
 sun::misc::Unsafe::putIntVolatile (jobject obj, jlong offset, jint value)
 {
- jint *addr = (jint *) ((char *) obj + offset);
+ __sync_synchronize();
+ volatile jint *addr = (jint *) ((char *) obj + offset);
 *addr = value;
 }
 
 void
 sun::misc::Unsafe::putLongVolatile (jobject obj, jlong offset, jlong value)
 {
- jlong *addr = (jlong *) ((char *) obj + offset);
+ __sync_synchronize();
+ volatile jlong *addr = (jlong *) ((char *) obj + offset);
 *addr = value;
 }
 
 void
 sun::misc::Unsafe::putObjectVolatile (jobject obj, jlong offset, jobject value)
 {
- jobject *addr = (jobject *) ((char *) obj + offset);
+ __sync_synchronize();
+ volatile jobject *addr = (jobject *) ((char *) obj + offset);
 *addr = value;
 }
 
@@ -127,15 +130,19 @@
 jint
 sun::misc::Unsafe::getIntVolatile (jobject obj, jlong offset)
 {
- jint *addr = (jint *) ((char *) obj + offset);
- return *addr;
+ volatile jint *addr = (jint *) ((char *) obj + offset);
+ jint result = *addr;
+ __sync_synchronize();
+ return result;
 }
 
 jobject
 sun::misc::Unsafe::getObjectVolatile (jobject obj, jlong offset)
 {
- jobject *addr = (jobject *) ((char *) obj + offset);
- return *addr;
+ volatile jobject *addr = (jobject *) ((char *) obj + offset);
+ jobject result = *addr;
+ __sync_synchronize();
+ return result;
 }
 
 jlong
@@ -148,8 +155,10 @@
 jlong
 sun::misc::Unsafe::getLongVolatile (jobject obj, jlong offset)
 {
- jlong *addr = (jlong *) ((char *) obj + offset);
- return *addr;
+ volatile jlong *addr = (jlong *) ((char *) obj + offset);
+ jlong result = *addr;
+ __sync_synchronize();
+ return result;
 }
 
 void


More information about the Java mailing list

AltStyle によって変換されたページ (->オリジナル) /