# HG changeset patch # User Thomas Wuerthinger # Date 1397665990 -7200 # Node ID 7bc92bdfd3225b03774478a9d230cfc4714f17e9 # Parent cf49b4e72de501b67a6ad7791e6c7a8466a07f4d Introduce versioning of installed code. diff -r cf49b4e72de5 -r 7bc92bdfd322 graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/InstalledCode.java --- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/InstalledCode.java Wed Apr 16 18:20:55 2014 +0200 +++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/InstalledCode.java Wed Apr 16 18:33:10 2014 +0200 @@ -34,13 +34,25 @@ private long address; /** + * Counts how often the address field was reassigned. + */ + private long version; + + /** * @return the address of this code blob */ - public long getAddress() { + public final long getAddress() { return address; } /** + * @return the address of this code blob + */ + public final long getVersion() { + return version; + } + + /** * Returns the start address of this installed code if it is {@linkplain #isValid() valid}, 0 * otherwise. */ diff -r cf49b4e72de5 -r 7bc92bdfd322 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedAssumption.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedAssumption.java Wed Apr 16 18:20:55 2014 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedAssumption.java Wed Apr 16 18:33:10 2014 +0200 @@ -23,7 +23,6 @@ package com.oracle.graal.truffle; import java.lang.ref.*; -import java.util.*; import com.oracle.graal.api.code.*; import com.oracle.truffle.api.impl.*; @@ -31,7 +30,13 @@ public final class OptimizedAssumption extends AbstractAssumption { - List> dependentInstalledCode; + private static class Entry { + WeakReference installedCode; + long version; + Entry next; + } + + private Entry first; public OptimizedAssumption(String name) { super(name); @@ -47,25 +52,26 @@ @Override public synchronized void invalidate() { if (isValid) { - if (dependentInstalledCode != null) { - for (WeakReference installedCodeReference : dependentInstalledCode) { - InstalledCode installedCode = installedCodeReference.get(); - if (installedCode != null) { - installedCode.invalidate(); - } + Entry e = first; + while (e != null) { + InstalledCode installedCode = e.installedCode.get(); + if (installedCode != null && installedCode.getVersion() == e.version) { + installedCode.invalidate(); } - dependentInstalledCode = null; + e = e.next; } + first = null; isValid = false; } } public synchronized void registerInstalledCode(InstalledCode installedCode) { if (isValid) { - if (dependentInstalledCode == null) { - dependentInstalledCode = new ArrayList<>(); - } - dependentInstalledCode.add(new WeakReference<>(installedCode)); + Entry e = new Entry(); + e.installedCode = new WeakReference<>(installedCode); + e.version = installedCode.getVersion(); + e.next = first; + first = e; } else { installedCode.invalidate(); } diff -r cf49b4e72de5 -r 7bc92bdfd322 src/share/vm/graal/graalCompilerToVM.cpp --- a/src/share/vm/graal/graalCompilerToVM.cpp Wed Apr 16 18:20:55 2014 +0200 +++ b/src/share/vm/graal/graalCompilerToVM.cpp Wed Apr 16 18:33:10 2014 +0200 @@ -533,6 +533,7 @@ if (!installed_code_handle.is_null()) { assert(installed_code_handle->is_a(InstalledCode::klass()), "wrong type"); InstalledCode::set_address(installed_code_handle, (jlong) cb); + InstalledCode::set_version(installed_code_handle, InstalledCode::version(installed_code_handle) + 1); oop comp_result = HotSpotCompiledCode::comp(compiled_code_handle); if (comp_result->is_a(ExternalCompilationResult::klass())) { if (TraceGPUInteraction) { diff -r cf49b4e72de5 -r 7bc92bdfd322 src/share/vm/graal/graalJavaAccess.hpp --- a/src/share/vm/graal/graalJavaAccess.hpp Wed Apr 16 18:20:55 2014 +0200 +++ b/src/share/vm/graal/graalJavaAccess.hpp Wed Apr 16 18:33:10 2014 +0200 @@ -61,6 +61,7 @@ end_class \ start_class(InstalledCode) \ long_field(InstalledCode, address) \ + long_field(InstalledCode, version) \ end_class \ start_class(HotSpotInstalledCode) \ int_field(HotSpotInstalledCode, size) \