changeset 13643:4463c520f475

Keep speculations alive in the speculation log
author Gilles Duboscq <duboscq@ssw.jku.at>
date Tue, 17 Dec 2013 11:55:08 +0100
parents 10f943c778f6
children e0102f250d76
files graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/SpeculationLog.java
diffstat 1 files changed, 12 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/SpeculationLog.java	Thu Dec 12 15:31:24 2013 +0100
+++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/SpeculationLog.java	Tue Dec 17 11:55:08 2013 +0100
@@ -23,6 +23,7 @@
 package com.oracle.graal.api.code;
 
 import java.util.*;
+import java.util.concurrent.*;
 
 import com.oracle.graal.api.meta.*;
 
@@ -31,8 +32,9 @@
  * 
  */
 public final class SpeculationLog {
+    private volatile Object lastFailed;
+    private volatile Collection<Object> speculations;
     private Set<Object> failedSpeculations;
-    private Object lastFailed;
 
     public synchronized void collectFailedSpeculations() {
         if (lastFailed != null) {
@@ -41,6 +43,7 @@
             }
             failedSpeculations.add(lastFailed);
             lastFailed = null;
+            speculations = null;
         }
     }
 
@@ -48,6 +51,14 @@
         if (failedSpeculations != null && failedSpeculations.contains(reason)) {
             return null;
         }
+        if (speculations == null) {
+            synchronized (this) {
+                if (speculations == null) {
+                    speculations = new ConcurrentLinkedQueue<>();
+                }
+            }
+        }
+        speculations.add(reason);
         return Constant.forObject(reason);
     }
 }