changeset 8446:7ef643b72910

gave MembarNode.memoryBarrier() an implementation that actually triggers barriers
author Doug Simon <doug.simon@oracle.com>
date Fri, 22 Mar 2013 15:08:29 +0100
parents 83fc36378013
children b6b9ab1fde62
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MembarNode.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/UnsafeSubstitutions.java
diffstat 2 files changed, 71 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MembarNode.java	Fri Mar 22 14:54:15 2013 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MembarNode.java	Fri Mar 22 15:08:29 2013 +0100
@@ -22,7 +22,14 @@
  */
 package com.oracle.graal.nodes.extended;
 
+import static com.oracle.graal.graph.UnsafeAccess.*;
+
+import java.lang.reflect.*;
+
+import sun.misc.*;
+
 import com.oracle.graal.api.code.*;
+import com.oracle.graal.graph.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.spi.*;
 import com.oracle.graal.nodes.type.*;
@@ -55,5 +62,25 @@
     @SuppressWarnings("unused")
     @NodeIntrinsic
     public static void memoryBarrier(@ConstantNodeParameter int barriers) {
+        // Overly conservative but it doesn't matter in the interpreter
+        unsafe.putIntVolatile(dummyBase, dummyOffset, 0);
+        unsafe.getIntVolatile(dummyBase, dummyOffset);
+    }
+
+    /**
+     * An unused field that it used to exercise barriers in the interpreter. This can be replaced
+     * with direct support for barriers in {@link Unsafe} if/when they become available.
+     */
+    @SuppressWarnings("unused") private static int dummy;
+    private static Object dummyBase;
+    private static long dummyOffset;
+    static {
+        try {
+            Field dummyField = MembarNode.class.getDeclaredField("dummy");
+            dummyBase = unsafe.staticFieldBase(dummyField);
+            dummyOffset = unsafe.staticFieldOffset(dummyField);
+        } catch (Exception e) {
+            throw new GraalInternalError(e);
+        }
     }
 }
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/UnsafeSubstitutions.java	Fri Mar 22 14:54:15 2013 +0100
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/UnsafeSubstitutions.java	Fri Mar 22 15:08:29 2013 +0100
@@ -22,7 +22,8 @@
  */
 package com.oracle.graal.replacements;
 
-import com.oracle.graal.api.code.*;
+import static com.oracle.graal.api.code.MemoryBarriers.*;
+
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.api.replacements.*;
 import com.oracle.graal.nodes.extended.*;
@@ -57,9 +58,9 @@
 
     @MethodSubstitution(isStatic = false)
     public static Object getObjectVolatile(final Object thisObj, Object o, long offset) {
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_READ);
+        MembarNode.memoryBarrier(JMM_PRE_VOLATILE_READ);
         Object result = getObject(thisObj, o, offset);
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_READ);
+        MembarNode.memoryBarrier(JMM_POST_VOLATILE_READ);
         return result;
     }
 
@@ -70,16 +71,16 @@
 
     @MethodSubstitution(isStatic = false)
     public static void putObjectVolatile(final Object thisObj, Object o, long offset, Object x) {
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_WRITE);
+        MembarNode.memoryBarrier(JMM_PRE_VOLATILE_WRITE);
         putObject(thisObj, o, offset, x);
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_WRITE);
+        MembarNode.memoryBarrier(JMM_POST_VOLATILE_WRITE);
     }
 
     @MethodSubstitution(isStatic = false)
     public static void putOrderedObject(final Object thisObj, Object o, long offset, Object x) {
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_WRITE);
+        MembarNode.memoryBarrier(JMM_PRE_VOLATILE_WRITE);
         putObject(thisObj, o, offset, x);
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_WRITE);
+        MembarNode.memoryBarrier(JMM_POST_VOLATILE_WRITE);
     }
 
     @MethodSubstitution(isStatic = false)
@@ -90,9 +91,9 @@
 
     @MethodSubstitution(isStatic = false)
     public static int getIntVolatile(final Object thisObj, Object o, long offset) {
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_READ);
+        MembarNode.memoryBarrier(JMM_PRE_VOLATILE_READ);
         int result = getInt(thisObj, o, offset);
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_READ);
+        MembarNode.memoryBarrier(JMM_POST_VOLATILE_READ);
         return result;
     }
 
@@ -103,16 +104,16 @@
 
     @MethodSubstitution(isStatic = false)
     public static void putIntVolatile(final Object thisObj, Object o, long offset, int x) {
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_WRITE);
+        MembarNode.memoryBarrier(JMM_PRE_VOLATILE_WRITE);
         putInt(thisObj, o, offset, x);
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_WRITE);
+        MembarNode.memoryBarrier(JMM_POST_VOLATILE_WRITE);
     }
 
     @MethodSubstitution(isStatic = false)
     public static void putOrderedInt(final Object thisObj, Object o, long offset, int x) {
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_WRITE);
+        MembarNode.memoryBarrier(JMM_PRE_VOLATILE_WRITE);
         putInt(thisObj, o, offset, x);
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_WRITE);
+        MembarNode.memoryBarrier(JMM_POST_VOLATILE_WRITE);
     }
 
     @MethodSubstitution(isStatic = false)
@@ -124,9 +125,9 @@
 
     @MethodSubstitution(isStatic = false)
     public static boolean getBooleanVolatile(final Object thisObj, Object o, long offset) {
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_READ);
+        MembarNode.memoryBarrier(JMM_PRE_VOLATILE_READ);
         boolean result = getBoolean(thisObj, o, offset);
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_READ);
+        MembarNode.memoryBarrier(JMM_POST_VOLATILE_READ);
         return result;
     }
 
@@ -137,9 +138,9 @@
 
     @MethodSubstitution(isStatic = false)
     public static void putBooleanVolatile(final Object thisObj, Object o, long offset, boolean x) {
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_WRITE);
+        MembarNode.memoryBarrier(JMM_PRE_VOLATILE_WRITE);
         putBoolean(thisObj, o, offset, x);
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_WRITE);
+        MembarNode.memoryBarrier(JMM_POST_VOLATILE_WRITE);
     }
 
     @MethodSubstitution(isStatic = false)
@@ -151,9 +152,9 @@
 
     @MethodSubstitution(isStatic = false)
     public static byte getByteVolatile(final Object thisObj, Object o, long offset) {
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_READ);
+        MembarNode.memoryBarrier(JMM_PRE_VOLATILE_READ);
         byte result = getByte(thisObj, o, offset);
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_READ);
+        MembarNode.memoryBarrier(JMM_POST_VOLATILE_READ);
         return result;
     }
 
@@ -164,9 +165,9 @@
 
     @MethodSubstitution(isStatic = false)
     public static void putByteVolatile(final Object thisObj, Object o, long offset, byte x) {
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_WRITE);
+        MembarNode.memoryBarrier(JMM_PRE_VOLATILE_WRITE);
         putByte(thisObj, o, offset, x);
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_WRITE);
+        MembarNode.memoryBarrier(JMM_POST_VOLATILE_WRITE);
     }
 
     @MethodSubstitution(isStatic = false)
@@ -178,9 +179,9 @@
 
     @MethodSubstitution(isStatic = false)
     public static short getShortVolatile(final Object thisObj, Object o, long offset) {
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_READ);
+        MembarNode.memoryBarrier(JMM_PRE_VOLATILE_READ);
         short result = getShort(thisObj, o, offset);
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_READ);
+        MembarNode.memoryBarrier(JMM_POST_VOLATILE_READ);
         return result;
     }
 
@@ -191,9 +192,9 @@
 
     @MethodSubstitution(isStatic = false)
     public static void putShortVolatile(final Object thisObj, Object o, long offset, short x) {
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_WRITE);
+        MembarNode.memoryBarrier(JMM_PRE_VOLATILE_WRITE);
         putShort(thisObj, o, offset, x);
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_WRITE);
+        MembarNode.memoryBarrier(JMM_POST_VOLATILE_WRITE);
     }
 
     @MethodSubstitution(isStatic = false)
@@ -205,9 +206,9 @@
 
     @MethodSubstitution(isStatic = false)
     public static char getCharVolatile(final Object thisObj, Object o, long offset) {
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_READ);
+        MembarNode.memoryBarrier(JMM_PRE_VOLATILE_READ);
         char result = getChar(thisObj, o, offset);
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_READ);
+        MembarNode.memoryBarrier(JMM_POST_VOLATILE_READ);
         return result;
     }
 
@@ -218,9 +219,9 @@
 
     @MethodSubstitution(isStatic = false)
     public static void putCharVolatile(final Object thisObj, Object o, long offset, char x) {
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_WRITE);
+        MembarNode.memoryBarrier(JMM_PRE_VOLATILE_WRITE);
         putChar(thisObj, o, offset, x);
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_WRITE);
+        MembarNode.memoryBarrier(JMM_POST_VOLATILE_WRITE);
     }
 
     @MethodSubstitution(isStatic = false)
@@ -232,9 +233,9 @@
 
     @MethodSubstitution(isStatic = false)
     public static long getLongVolatile(final Object thisObj, Object o, long offset) {
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_READ);
+        MembarNode.memoryBarrier(JMM_PRE_VOLATILE_READ);
         long result = getLong(thisObj, o, offset);
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_READ);
+        MembarNode.memoryBarrier(JMM_POST_VOLATILE_READ);
         return result;
     }
 
@@ -245,16 +246,16 @@
 
     @MethodSubstitution(isStatic = false)
     public static void putLongVolatile(final Object thisObj, Object o, long offset, long x) {
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_WRITE);
+        MembarNode.memoryBarrier(JMM_PRE_VOLATILE_WRITE);
         putLong(thisObj, o, offset, x);
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_WRITE);
+        MembarNode.memoryBarrier(JMM_POST_VOLATILE_WRITE);
     }
 
     @MethodSubstitution(isStatic = false)
     public static void putOrderedLong(final Object thisObj, Object o, long offset, long x) {
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_WRITE);
+        MembarNode.memoryBarrier(JMM_PRE_VOLATILE_WRITE);
         putLong(thisObj, o, offset, x);
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_WRITE);
+        MembarNode.memoryBarrier(JMM_POST_VOLATILE_WRITE);
     }
 
     @MethodSubstitution(isStatic = false)
@@ -266,9 +267,9 @@
 
     @MethodSubstitution(isStatic = false)
     public static float getFloatVolatile(final Object thisObj, Object o, long offset) {
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_READ);
+        MembarNode.memoryBarrier(JMM_PRE_VOLATILE_READ);
         float result = getFloat(thisObj, o, offset);
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_READ);
+        MembarNode.memoryBarrier(JMM_POST_VOLATILE_READ);
         return result;
     }
 
@@ -279,9 +280,9 @@
 
     @MethodSubstitution(isStatic = false)
     public static void putFloatVolatile(final Object thisObj, Object o, long offset, float x) {
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_WRITE);
+        MembarNode.memoryBarrier(JMM_PRE_VOLATILE_WRITE);
         putFloat(thisObj, o, offset, x);
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_WRITE);
+        MembarNode.memoryBarrier(JMM_POST_VOLATILE_WRITE);
     }
 
     @MethodSubstitution(isStatic = false)
@@ -293,9 +294,9 @@
 
     @MethodSubstitution(isStatic = false)
     public static double getDoubleVolatile(final Object thisObj, Object o, long offset) {
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_READ);
+        MembarNode.memoryBarrier(JMM_PRE_VOLATILE_READ);
         double result = getDouble(thisObj, o, offset);
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_READ);
+        MembarNode.memoryBarrier(JMM_POST_VOLATILE_READ);
         return result;
     }
 
@@ -306,9 +307,9 @@
 
     @MethodSubstitution(isStatic = false)
     public static void putDoubleVolatile(final Object thisObj, Object o, long offset, double x) {
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_PRE_VOLATILE_WRITE);
+        MembarNode.memoryBarrier(JMM_PRE_VOLATILE_WRITE);
         putDouble(thisObj, o, offset, x);
-        MembarNode.memoryBarrier(MemoryBarriers.JMM_POST_VOLATILE_WRITE);
+        MembarNode.memoryBarrier(JMM_POST_VOLATILE_WRITE);
     }
 
     @MethodSubstitution(isStatic = false)