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 }