Mercurial > hg > graal-jvmci-8
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)