< prev index next >
src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotSpeculationLog.java
Print this page
@@ -20,15 +20,65 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.vm.ci.hotspot;
-import jdk.vm.ci.meta.*;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.ConcurrentLinkedQueue;
-public class HotSpotSpeculationLog extends SpeculationLog {
+import jdk.vm.ci.meta.JavaConstant;
+import jdk.vm.ci.meta.SpeculationLog;
+
+public class HotSpotSpeculationLog implements SpeculationLog {
+
+ /** Written by the C++ code that performs deoptimization. */
+ private volatile Object lastFailed;
+
+ /** All speculations that have been a deoptimization reason. */
+ private Set<SpeculationReason> failedSpeculations;
+
+ /** Strong references to all reasons embededded in the current nmethod. */
+ private volatile Collection<SpeculationReason> speculations;
+
+ @Override
+ public synchronized void collectFailedSpeculations() {
+ if (lastFailed != null) {
+ if (failedSpeculations == null) {
+ failedSpeculations = new HashSet<>(2);
+ }
+ failedSpeculations.add((SpeculationReason) lastFailed);
+ lastFailed = null;
+ speculations = null;
+ }
+ }
@Override
- public JavaConstant speculate(Object reason) {
- addSpeculation(reason);
+ public boolean maySpeculate(SpeculationReason reason) {
+ if (failedSpeculations != null && failedSpeculations.contains(reason)) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public JavaConstant speculate(SpeculationReason reason) {
+ assert maySpeculate(reason);
+
+ /*
+ * Objects referenced from nmethods are weak references. We need a strong reference to the
+ * reason objects that are embedded in nmethods, so we add them to the speculations
+ * collection.
+ */
+ if (speculations == null) {
+ synchronized (this) {
+ if (speculations == null) {
+ speculations = new ConcurrentLinkedQueue<>();
+ }
+ }
+ }
+ speculations.add(reason);
+
return HotSpotObjectConstantImpl.forObject(reason);
}
}
< prev index next >