diff --git a/src/hotspot/share/oops/stackChunkOop.hpp b/src/hotspot/share/oops/stackChunkOop.hpp index f6ce1ecc500..c1c0aee8f24 100644 --- a/src/hotspot/share/oops/stackChunkOop.hpp +++ b/src/hotspot/share/oops/stackChunkOop.hpp @@ -91,6 +91,8 @@ public: inline int max_thawing_size() const; inline void set_max_thawing_size(int value); + inline oop cont() const; + template inline oop cont() const; inline void set_cont(oop value); template diff --git a/src/hotspot/share/oops/stackChunkOop.inline.hpp b/src/hotspot/share/oops/stackChunkOop.inline.hpp index 5de21075666..41ce22a7c34 100644 --- a/src/hotspot/share/oops/stackChunkOop.inline.hpp +++ b/src/hotspot/share/oops/stackChunkOop.inline.hpp @@ -86,7 +86,18 @@ inline void stackChunkOopDesc::set_max_thawing_size(int value) { jdk_internal_vm_StackChunk::set_maxThawingSize(this, (jint)value); } -inline oop stackChunkOopDesc::cont() const { return jdk_internal_vm_StackChunk::cont(as_oop()); } +inline oop stackChunkOopDesc::cont() const { return UseCompressedOops ? cont() : cont(); /* jdk_internal_vm_StackChunk::cont(as_oop()); */ } +template +inline oop stackChunkOopDesc::cont() const { + // The state of the cont oop is used by ZCollectedHeap::requires_barriers, + // to determine the age of the stackChunkOopDesc. For that to work, it is + // only the GC that is allowed to perform a load barrier on the oop. + // This function is used by non-GC code and therfore create a stack-local + // copy on the oop and perform the load barrier on that copy instead. + oop obj = jdk_internal_vm_StackChunk::cont_raw

(as_oop()); + obj = (oop)NativeAccess<>::oop_load(&obj); + return obj; +} inline void stackChunkOopDesc::set_cont(oop value) { jdk_internal_vm_StackChunk::set_cont(this, value); } template inline void stackChunkOopDesc::set_cont_raw(oop value) { jdk_internal_vm_StackChunk::set_cont_raw

(this, value); } diff --git a/src/hotspot/share/runtime/continuationJavaClasses.hpp b/src/hotspot/share/runtime/continuationJavaClasses.hpp index 2186dbe3535..d8634161a4b 100644 --- a/src/hotspot/share/runtime/continuationJavaClasses.hpp +++ b/src/hotspot/share/runtime/continuationJavaClasses.hpp @@ -124,7 +124,8 @@ class jdk_internal_vm_StackChunk: AllStatic { static inline void set_maxThawingSize(oop chunk, int value); // cont oop's processing is essential for the chunk's GC protocol - static inline oop cont(oop chunk); + template + static inline oop cont_raw(oop chunk); static inline void set_cont(oop chunk, oop value); template static inline void set_cont_raw(oop chunk, oop value); diff --git a/src/hotspot/share/runtime/continuationJavaClasses.inline.hpp b/src/hotspot/share/runtime/continuationJavaClasses.inline.hpp index 1d0ff75225a..5bba4016033 100644 --- a/src/hotspot/share/runtime/continuationJavaClasses.inline.hpp +++ b/src/hotspot/share/runtime/continuationJavaClasses.inline.hpp @@ -81,8 +81,9 @@ inline void jdk_internal_vm_StackChunk::set_parent_access(oop chunk, oop value) chunk->obj_field_put_access(_parent_offset, value); } -inline oop jdk_internal_vm_StackChunk::cont(oop chunk) { - return chunk->obj_field(_cont_offset); +template +inline oop jdk_internal_vm_StackChunk::cont_raw(oop chunk) { + return (oop)RawAccess<>::oop_load(chunk->field_addr

(_cont_offset)); } inline void jdk_internal_vm_StackChunk::set_cont(oop chunk, oop value) {