This is the mail archive of the java@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[ecj] More sun.misc.Unsafe stuff


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]