Mercurial > hg > graal-jvmci-8
comparison jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotSpeculationLog.java @ 22699:ea58bbafd5b9
Move SpeculationLog implementation to HotSpotSpeculationLog, because it is not useful for other VMs
author | Christian Wimmer <christian.wimmer@oracle.com> |
---|---|
date | Wed, 21 Oct 2015 09:06:12 -0700 |
parents | 1bbd4a7c274b |
children | 32d6bceb9adc |
comparison
equal
deleted
inserted
replaced
22698:37505a836aaf | 22699:ea58bbafd5b9 |
---|---|
20 * or visit www.oracle.com if you need additional information or have any | 20 * or visit www.oracle.com if you need additional information or have any |
21 * questions. | 21 * questions. |
22 */ | 22 */ |
23 package jdk.vm.ci.hotspot; | 23 package jdk.vm.ci.hotspot; |
24 | 24 |
25 import java.util.Collection; | |
26 import java.util.HashSet; | |
27 import java.util.Set; | |
28 import java.util.concurrent.ConcurrentLinkedQueue; | |
29 | |
25 import jdk.vm.ci.meta.JavaConstant; | 30 import jdk.vm.ci.meta.JavaConstant; |
26 import jdk.vm.ci.meta.SpeculationLog; | 31 import jdk.vm.ci.meta.SpeculationLog; |
27 | 32 |
28 public class HotSpotSpeculationLog extends SpeculationLog { | 33 public class HotSpotSpeculationLog implements SpeculationLog { |
34 | |
35 /** Written by the C++ code that performs deoptimization. */ | |
36 private volatile Object lastFailed; | |
37 | |
38 /** All speculations that have been a deoptimization reason. */ | |
39 private Set<SpeculationReason> failedSpeculations; | |
40 | |
41 /** Strong references to all reasons embededded in the current nmethod. */ | |
42 private volatile Collection<SpeculationReason> speculations; | |
29 | 43 |
30 @Override | 44 @Override |
31 public JavaConstant speculate(Object reason) { | 45 public synchronized void collectFailedSpeculations() { |
32 addSpeculation(reason); | 46 if (lastFailed != null) { |
47 if (failedSpeculations == null) { | |
48 failedSpeculations = new HashSet<>(2); | |
49 } | |
50 failedSpeculations.add((SpeculationReason) lastFailed); | |
51 lastFailed = null; | |
52 speculations = null; | |
53 } | |
54 } | |
55 | |
56 @Override | |
57 public boolean maySpeculate(SpeculationReason reason) { | |
58 if (failedSpeculations != null && failedSpeculations.contains(reason)) { | |
59 return false; | |
60 } | |
61 return true; | |
62 } | |
63 | |
64 @Override | |
65 public JavaConstant speculate(SpeculationReason reason) { | |
66 assert maySpeculate(reason); | |
67 | |
68 /* | |
69 * Objects referenced from nmethods are weak references. We need a strong reference to the | |
70 * reason objects that are embedded in nmethods, so we add them to the speculations | |
71 * collection. | |
72 */ | |
73 if (speculations == null) { | |
74 synchronized (this) { | |
75 if (speculations == null) { | |
76 speculations = new ConcurrentLinkedQueue<>(); | |
77 } | |
78 } | |
79 } | |
80 speculations.add(reason); | |
81 | |
33 return HotSpotObjectConstantImpl.forObject(reason); | 82 return HotSpotObjectConstantImpl.forObject(reason); |
34 } | 83 } |
35 } | 84 } |