# HG changeset patch # User kbarrett # Date 1474669392 14400 # Fri Sep 23 18:23:12 2016 -0400 # Node ID 3296281c85d3d7aa95a2aa95aa4801bf1a343426 # Parent 7f7c1e1fbc8a70f9730339872ddf56fee812304c 8166583: Add oopDesc::klass_or_null_acquire() Summary: Added new function. Reviewed-by: dholmes, tschatzl diff --git a/src/share/vm/oops/oop.hpp b/src/share/vm/oops/oop.hpp --- a/hotspot/src/share/vm/oops/oop.hpp +++ b/hotspot/src/share/vm/oops/oop.hpp @@ -83,6 +83,7 @@ Klass* klass() const; Klass* klass_or_null() const volatile; + Klass* klass_or_null_acquire() const volatile; Klass** klass_addr(); narrowKlass* compressed_klass_addr(); diff --git a/src/share/vm/oops/oop.inline.hpp b/src/share/vm/oops/oop.inline.hpp --- a/hotspot/src/share/vm/oops/oop.inline.hpp +++ b/hotspot/src/share/vm/oops/oop.inline.hpp @@ -78,7 +78,6 @@ } inline Klass* oopDesc::klass_or_null() const volatile { - // can be NULL in CMS if (UseCompressedClassPointers) { return Klass::decode_klass(_metadata._compressed_klass); } else { @@ -86,6 +85,17 @@ } } +inline Klass* oopDesc::klass_or_null_acquire() const volatile { + if (UseCompressedClassPointers) { + // Workaround for non-const load_acquire parameter. + const volatile narrowKlass* addr = &_metadata._compressed_klass; + volatile narrowKlass* xaddr = const_cast(addr); + return Klass::decode_klass(OrderAccess::load_acquire(xaddr)); + } else { + return (Klass*)OrderAccess::load_ptr_acquire(&_metadata._klass); + } +} + inline int oopDesc::klass_gap_offset_in_bytes() { assert(UseCompressedClassPointers, "only applicable to compressed klass pointers"); return oopDesc::klass_offset_in_bytes() + sizeof(narrowKlass);