RFR: 8229258: Make markOopDesc AllStatic
Stefan Karlsson
stefan.karlsson at oracle.com
Thu Aug 8 12:35:19 UTC 2019
On 2019-08-08 14:18, coleen.phillimore at oracle.com wrote:
> Is this patch based off another in your queue? It looks like MarkWord
> has already been introduced.
>
> https://cr.openjdk.java.net/~stefank/8229258/webrev.01/src/hotspot/cpu/aarch64/aarch64.ad.udiff.html
>
>
> - // Set tmp to be (markOop of object | UNLOCK_VALUE).
> + // Set tmp to be (markWord of object | UNLOCK_VALUE).
> __ orr(tmp, disp_hdr, MarkWord::unlocked_value);
>
>
> I was trying to see how many lines were changed to static function calls
> on MarkWord, vs obj->mark()->something().
>
> My thought was it was not enough to try to make MarkWord contain
> markWord to enable this simpler syntax. There are 543 MarkWord:: in
> your patch but some are constant references, which would still be there
> if you made MarkWord contain markWord.
Hmm. You are right. I generated an incorrect webrev. I reran webrev with
-r qparent and now have this:
http://cr.openjdk.java.net/~stefank/8229258/webrev.02/
>
> I do have one request to think about. Could MarkWord be a longer name
> like MarkWord{Impl}? Don't like "Impl" though. I don't want to
> bikeshed but it took me a while to spot that the 'm's were different in
> markWord and MarkWord. Maybe that's the point but there's going to be a
> lot of mistyping.
I got the same feedback from Kim but I'm personally not keen on making
the name any longer. Specially now when MarkWord:: is being appended to
all mark word operations.
If enough reviewers push back on this, then I guess I have to change this.
Thanks,
StefanK
>
> Coleen
>
> On 8/8/19 7:01 AM, Stefan Karlsson wrote:
>>
>>
>> On 2019-08-08 12:22, Roman Kennke wrote:
>>> First glance.
>>>
>>> Instead of making it AllStatic, I'd probably have made it a plain
>>> object:
>>>
>>> class markWord {
>>> }
>>>
>>> and instead of changing e.g.:
>>>
>>> obj->mark().set_unlocked();
>>>
>>> to
>>>
>>> MarkWord::set_unlocked(obj->mark());
>>>
>>> leave it like it is. Looks/feels better to me.
>>>
>>> Have you tried that? Is this too tricky to do? Or what is the reason to
>>> use static accessors there?
>>
>> Not sure if you mean that we should still play tricks with the this
>> pointer. If that's the case then, that would retain the undefined
>> behavior that this patch removes (by using the static accessors). One
>> example given below is:
>>
>> bool is_being_inflated() const { return (value() == 0); }
>>
>> which ends up comparing this to NULL.
>>
>> But maybe you suggests adding the mark word bits as a value in
>> MarkWord? Something like this:
>>
>> class MarkWord {
>> uintptr_t _value;
>>
>> // and keep the functions as non-static functions
>> bool is_being_inflated() const { return (_value == 0); }
>> }
>>
>> then, yes, I tried that because I also felt that it was unfortunate
>> that I had to retransform the code in this way. However, I backed off
>> because of different hurdles that I couldn't trivially solve. For
>> example:
>>
>> class oopDesc {
>> volatile markWord _mark;
>> }
>> ...
>> _mark = prototype(); <-- complains here that the assignment operator
>> discards volatile qualifier
>>
>> I'm unsure what performance effects it will have if I provide a
>> hand-written assignment operator, since the class will not be a
>> trivial class anymore. Because of that, I backed away from such a change.
>>
>> I'm not at all opposed to wait with this patch if someone wants to
>> take the time to retry that experiment.
>>
>> Thanks,
>> StefanK
>>
>>>
>>> Roman
>>>
>>>> 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