changeset 15166:7bc92bdfd322

Introduce versioning of installed code.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Wed, 16 Apr 2014 18:33:10 +0200
parents cf49b4e72de5
children 258e3e0b5e2e
files graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/InstalledCode.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedAssumption.java src/share/vm/graal/graalCompilerToVM.cpp src/share/vm/graal/graalJavaAccess.hpp
diffstat 4 files changed, 34 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- 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.
      */
--- 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<WeakReference<InstalledCode>> dependentInstalledCode;
+    private static class Entry {
+        WeakReference<InstalledCode> 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<InstalledCode> 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();
         }
--- 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) {
--- 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)                                                                                                                      \