# HG changeset patch # User Doug Simon # Date 1363961309 -3600 # Node ID 7ef643b729103c745348142a8f7f452b9882bbb9 # Parent 83fc36378013d5627bbacbf0757257dd0f062fdd gave MembarNode.memoryBarrier() an implementation that actually triggers barriers diff -r 83fc36378013 -r 7ef643b72910 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MembarNode.java --- 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); + } } } diff -r 83fc36378013 -r 7ef643b72910 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/UnsafeSubstitutions.java --- 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)