# HG changeset patch # User dlong # Date 1556224534 25200 # Thu Apr 25 13:35:34 2019 -0700 # Node ID 6adaac5e03f05b682e85227c6bd59dd198a32f6d # Parent dcb78d2f07e54d8602ceac61df515bc6ed7a41a4 [mq]: 8218700 diff --git a/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotJVMCIMetaAccessContext.java b/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotJVMCIMetaAccessContext.java --- a/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotJVMCIMetaAccessContext.java +++ b/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotJVMCIMetaAccessContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -145,10 +145,23 @@ } } - private final ClassValue> resolvedJavaType = new ClassValue<>() { + private static class WeakTypeRef { + private WeakReference ref; + WeakTypeRef(ResolvedJavaType value) { + set(value); + } + void set(ResolvedJavaType value) { + ref = new WeakReference(value); + } + ResolvedJavaType get() { + return ref.get(); + } + }; + + private final ClassValue resolvedJavaType = new ClassValue<>() { @Override - protected WeakReference computeValue(Class type) { - return new WeakReference<>(createClass(type)); + protected WeakTypeRef computeValue(Class type) { + return new WeakTypeRef(createClass(type)); } }; @@ -158,18 +171,15 @@ * @return the {@link ResolvedJavaType} corresponding to {@code javaClass} */ public ResolvedJavaType fromClass(Class javaClass) { - ResolvedJavaType javaType = null; - while (javaType == null) { - WeakReference type = resolvedJavaType.get(javaClass); - javaType = type.get(); - if (javaType == null) { - /* - * If the referent has become null, clear out the current value and let computeValue - * above create a new value. Reload the value in a loop because in theory the - * WeakReference referent can be reclaimed at any point. - */ - resolvedJavaType.remove(javaClass); - } + WeakTypeRef ref = resolvedJavaType.get(javaClass); + ResolvedJavaType javaType = ref.get(); + if (javaType == null) { + /* + * If the referent has become null, create a new value and + * update cached weak reference. + */ + javaType = createClass(javaClass); + ref.set(javaType); } return javaType; } diff --git a/test/hotspot/jtreg/ProblemList-graal.txt b/test/hotspot/jtreg/ProblemList-graal.txt --- a/test/hotspot/jtreg/ProblemList-graal.txt +++ b/test/hotspot/jtreg/ProblemList-graal.txt @@ -210,8 +210,6 @@ serviceability/tmtools/jstat/GcCapacityTest.java 8196611 generic-all serviceability/jvmti/HeapMonitor/MyPackage/HeapMonitorMultiArrayTest.java 8196611 generic-all -vmTestbase/gc/lock/jvmti/alloc/jvmtialloclock02/TestDescription.java 8218700 generic-all - vmTestbase/nsk/jdb/unmonitor/unmonitor001/unmonitor001.java 8218701 generic-all vmTestbase/nsk/jdb/clear/clear003/clear003.java 8218701 generic-all