This is the mail archive of the
java@gcc.gnu.org
mailing list for the Java project.
[ecj] More sun.misc.Unsafe stuff
- From: Andrew Haley <aph at redhat dot com>
- To: java at gcc dot gnu dot org
- Date: Fri, 29 Sep 2006 15:48:00 +0100
- Subject: [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