RFR: 8229258: Make markOopDesc AllStatic

Stefan Karlsson stefan.karlsson at oracle.com
Thu Aug 8 08:54:33 UTC 2019



On 2019-08-07 23:33, coleen.phillimore at oracle.com wrote:
> 
> I clicked through the cpu, oops, prims, runtime and sa directories. All 
> changes as expected.  Went through synchronizer.cpp too fast though, 
> somebody else should read that more carefully.
> 
> https://cr.openjdk.java.net/~stefank/8229258/webrev.01/src/hotspot/share/oops/oop.inline.hpp.udiff.html 
> 
> 
> -markOop oopDesc::mark() const {
> +markWord oopDesc::mark() const {
>     return HeapAccess<MO_VOLATILE>::load_at(as_oop(), 
> mark_offset_in_bytes());
>   }
> 
> -markOop oopDesc::mark_raw() const {
> +markWord oopDesc::mark_raw() const {
>     return _mark;
>   }
> 
> Nit, can you take out these blanks before 'const' while you're editing 
> these lines.  They don't line up with anything.

Done.

> 
> Removing the commented out SA code makes sense to me.  There are two 
> test directories for the SA.  One is here: open/test/jdk/sun/tools/jhsdb

Thanks. I tested both.

> 
> This looks great!  Thank you!

Thanks for reviewing!

StefanK

> Coleen
> 
> On 8/7/19 3:58 PM, Stefan Karlsson wrote:
>> Hi all,
>>
>> Please review this patch to make markOopDesc AllStatic.
>>
>> https://cr.openjdk.java.net/~stefank/8229258/webrev.01/
>> https://bugs.openjdk.java.net/browse/JDK-8229258
>>
>> From the RFE:
>>
>> I want to change/rename markOop and markOopDesc
>>
>> Today markOopDescs inherits from oopDesc even though they are not 
>> oopDescs (Java objects):
>>  `class markOopDesc : public oopDesc {`
>>
>> This is very confusing to new-comers (and probably to old-timers as 
>> well).
>>
>> A simple fix would be to break the inheritance and do the following 
>> rename:
>> markOopDesc -> MarkWord
>> markOop -> markWord
>>
>> However, there are more dubious code in this area. markOopDescs are 
>> created and used like this:
>>
>> ```
>> class oopDesc {
>> ...
>>   volatile markOop _mark;
>> ...
>> markOop  oopDesc::mark_raw()  const { return _mark; }
>> ...
>> // Usage
>> obj->mark_raw()->is_marked()
>> ...
>> // Implementation
>>   bool is_marked()   const {
>>     return (mask_bits(value(), lock_mask_in_place) == marked_value);
>>   }
>> ...
>> // Implementation
>>   bool is_being_inflated() const { return (value() == 0); }
>> ...
>> // Implementation of markOopDesc::value()
>>   uintptr_t value() const { return (uintptr_t) this; }
>> ```
>>
>> Remember, _mark is an arbitrary bit pattern describing the object. We 
>> treat it as if it were a pointer to a markOopDesc object, but it's not 
>> pointing to such an object. While using that (weird) pointer we call 
>> value() and extract it's bit pattern to be used for further bit 
>> pattern checking functions. AFAICT, this is also undefined behavior. 
>> At least is_being_inflated() const is effectively 'return (uintptr_t) 
>> this == NULL'. This UB was recently discussed here:
>>  https://mail.openjdk.java.net/pipermail/hotspot-dev/2019-July/038704.html 
>>
>>  https://mail.openjdk.java.net/pipermail/hotspot-dev/2019-July/038712.html 
>>
>>
>> I propose that we change MarkWord (markOopDesc) to be an AllStatic 
>> class instead and get rid of this (ab)use of the markWord (markOop) 
>> pointer.
>>
>> The patch is large but mostly straight forward. However, there is some 
>> Java code that would need some extra scrutiny: SA and JVMCI.
>>
>> Tested with tier1-3.
>>
>> Coleen has asked for file rename from markOop.hpp to markWord.hpp. I'd 
>> like to do that as a separate RFE when/if this patch gets accepted.
>>
>> Thanks,
>> StefanK
>>
> 


More information about the hotspot-dev mailing list