From c32a34c2e534147bccf8320b095edda9e1088f5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20=C3=96sterlund?= Date: Wed, 4 Jan 2023 14:49:44 +0000 Subject: [PATCH] 8299072: java_lang_ref_Reference::clear_referent should be GC agnostic Co-authored-by: Axel Boldt-Christmas Reviewed-by: dholmes, shade, kbarrett --- src/hotspot/share/classfile/javaClasses.hpp | 1 + src/hotspot/share/classfile/javaClasses.inline.hpp | 4 ++++ src/hotspot/share/gc/shared/referenceProcessor.cpp | 2 +- .../share/gc/shenandoah/shenandoahReferenceProcessor.cpp | 2 +- src/hotspot/share/gc/z/zReferenceProcessor.cpp | 2 +- 5 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/hotspot/share/classfile/javaClasses.hpp b/src/hotspot/share/classfile/javaClasses.hpp index 665d6aa97ec..62fedd89e6b 100644 --- a/src/hotspot/share/classfile/javaClasses.hpp +++ b/src/hotspot/share/classfile/javaClasses.hpp @@ -952,6 +952,7 @@ class java_lang_ref_Reference: AllStatic { static inline oop phantom_referent_no_keepalive(oop ref); static inline oop unknown_referent_no_keepalive(oop ref); static inline void clear_referent(oop ref); + static inline void clear_referent_raw(oop ref); static inline HeapWord* referent_addr_raw(oop ref); static inline oop next(oop ref); static inline void set_next(oop ref, oop value); diff --git a/src/hotspot/share/classfile/javaClasses.inline.hpp b/src/hotspot/share/classfile/javaClasses.inline.hpp index 1f0b5f42796..386f3094279 100644 --- a/src/hotspot/share/classfile/javaClasses.inline.hpp +++ b/src/hotspot/share/classfile/javaClasses.inline.hpp @@ -152,6 +152,10 @@ oop java_lang_ref_Reference::unknown_referent_no_keepalive(oop ref) { } void java_lang_ref_Reference::clear_referent(oop ref) { + HeapAccess::oop_store_at(ref, _referent_offset, nullptr); +} + +void java_lang_ref_Reference::clear_referent_raw(oop ref) { ref->obj_field_put_raw(_referent_offset, nullptr); } diff --git a/src/hotspot/share/gc/shared/referenceProcessor.cpp b/src/hotspot/share/gc/shared/referenceProcessor.cpp index 894c3d91cd9..f6666858b5f 100644 --- a/src/hotspot/share/gc/shared/referenceProcessor.cpp +++ b/src/hotspot/share/gc/shared/referenceProcessor.cpp @@ -282,7 +282,7 @@ void DiscoveredListIterator::make_referent_alive() { } void DiscoveredListIterator::clear_referent() { - java_lang_ref_Reference::clear_referent(_current_discovered); + java_lang_ref_Reference::clear_referent_raw(_current_discovered); } void DiscoveredListIterator::enqueue() { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahReferenceProcessor.cpp b/src/hotspot/share/gc/shenandoah/shenandoahReferenceProcessor.cpp index b828582336c..1cc5686489f 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahReferenceProcessor.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahReferenceProcessor.cpp @@ -90,7 +90,7 @@ static oop reference_referent(oop reference) { } static void reference_clear_referent(oop reference) { - java_lang_ref_Reference::clear_referent(reference); + java_lang_ref_Reference::clear_referent_raw(reference); } template diff --git a/src/hotspot/share/gc/z/zReferenceProcessor.cpp b/src/hotspot/share/gc/z/zReferenceProcessor.cpp index 0c2df388882..042323c8777 100644 --- a/src/hotspot/share/gc/z/zReferenceProcessor.cpp +++ b/src/hotspot/share/gc/z/zReferenceProcessor.cpp @@ -72,7 +72,7 @@ static oop reference_referent(oop reference) { } static void reference_clear_referent(oop reference) { - java_lang_ref_Reference::clear_referent(reference); + java_lang_ref_Reference::clear_referent_raw(reference); } static oop* reference_discovered_addr(oop reference) {