# HG changeset patch # User Stefan Anzinger # Date 1430839847 -7200 # Node ID 39ee26e852562e2a5928f42960f70599771cf96c # Parent e11eb6ec180e7b68c657b6ba68f8157e38ec75a0 Use boxed cache in HotSpotConstantpool instead of synchronization diff -r e11eb6ec180e -r 39ee26e85256 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstantPool.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstantPool.java Mon May 04 23:15:42 2015 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstantPool.java Tue May 05 17:30:47 2015 +0200 @@ -115,13 +115,23 @@ } } + private static class LookupTypeCacheElement { + int lastCpi = Integer.MIN_VALUE; + JavaType javaType; + + public LookupTypeCacheElement(int lastCpi, JavaType javaType) { + super(); + this.lastCpi = lastCpi; + this.javaType = javaType; + } + } + /** * Reference to the C++ ConstantPool object. */ private final long metaspaceConstantPool; private final Object[] cache; - private ResolvedJavaType lastType; - private int lastTypeCpi = Integer.MIN_VALUE; + private volatile LookupTypeCacheElement lastLookupType; public HotSpotConstantPool(long metaspaceConstantPool) { this.metaspaceConstantPool = metaspaceConstantPool; @@ -489,22 +499,15 @@ @Override public JavaType lookupType(int cpi, int opcode) { - if (cpi == this.lastTypeCpi) { - synchronized (this) { - if (cpi == this.lastTypeCpi) { - return this.lastType; - } - } + final LookupTypeCacheElement elem = this.lastLookupType; + if (elem != null && elem.lastCpi == cpi) { + return elem.javaType; + } else { + final long metaspacePointer = runtime().getCompilerToVM().lookupKlassInPool(metaspaceConstantPool, cpi); + JavaType result = getJavaType(metaspacePointer); + this.lastLookupType = new LookupTypeCacheElement(cpi, result); + return result; } - final long metaspacePointer = runtime().getCompilerToVM().lookupKlassInPool(metaspaceConstantPool, cpi); - JavaType result = getJavaType(metaspacePointer); - if (result instanceof ResolvedJavaType) { - synchronized (this) { - this.lastType = (ResolvedJavaType) result; - this.lastTypeCpi = cpi; - } - } - return result; } @Override