RFR: 8227054: ServiceThread needs to know about all OopStorage objects

Erik Österlund erik.osterlund at oracle.com
Mon Aug 5 13:48:44 UTC 2019


Hi Coleen,

On 2019-08-05 15:23, coleen.phillimore at oracle.com wrote:
>
> Hi,
>
> Both versions of this change has the part that I like, ie removing 
> oopStorage initialization and most knowledge from the client code.
>
> While I don't like capital letters either, X macros make sense and we 
> have them everywhere.   I have to admit that this threw me and I was 
> not happy that it was going to take me time to puzzle out this trick, 
> which now I see is something that runs off the end of a struct.  
> please dont.
>
>    47   static StrongOopStorageSet _strong;
>    48   static WeakOopStorageSet _weak;
>    49
>    50   static OopStorage** strong_oopstorage_set() { return reinterpret_cast<OopStorage**>(&_strong); }
>    51   static OopStorage** weak_oopstorage_set() { return reinterpret_cast<OopStorage**>(&_weak); }
>    52   static OopStorage** all_oopstorage_set() { return strong_oopstorage_set(); }
>    53
> The new version of this isn't that much nicer to look at and still has 
> the reinterpret cast.
>
> The iterator and cpp file changes are nicer though.
>
> This seems to be a lot of effort to not repeat listing any of the 6 
> total oop storages that we have, which could be done in the .hpp file 
> alongside the weak/strong classifications.

Thanks for having a look. I agree I would be happier if this could be 
done without reinterpret_cast.
It's obviously possible with some extra boiler plate, but I know Kim 
doesn't like boilerplate.
But yeah, as you say, there are very few of these OopStorage instances, 
so I have no strong opinions
about adding that boilerplate (with an assert so you can't miss it).
I was mostly trying to show that there are alternatives to the macro 
metaprogramming  + enum approach, as a direction.

> I look forward to seeing Kim's next version.

Me too!

Thanks,
/Erik

> Coleen
>
> On 8/5/19 3:33 AM, Erik Österlund wrote:
>> Hi Kim,
>>
>> On 2019-08-05 04:35, Kim Barrett wrote:
>>> "... unless it’s aliasing rules, which I don’t mind violating given
>>> the chance."
>>>
>>> "... worth considering, I think, due to its simplicity."
>>>
>>> Those two phrases cannot legitimately be used to describe the same
>>> code.  Code that uses (and indeed fundamentally relies on) casts,
>>> especially reinterpret_casts, is never simple.
>>>
>>> Please don't casually violate the aliasing rules, and carefully
>>> document when it's being done and why.  reinterpret_casts (by whatever
>>> spelling) are a huge punch in the nose for the type system.  A
>>> multitude of sins can be hidden, sometimes unintentionally and to our
>>> significant detriment.  We resort to them *way* too often.
>>>
>>> The problem being dealt with here doesn't even come close to being one
>>> of those necessary evils where we (think we) must break the rules, so
>>> no, I don't like or accept that proposal.
>>
>> This conversation whether we should or should not care about the 
>> aliasing rules has been repeated many times. And the answer is always 
>> the same: we should not care about aliasing rules. Summary of why:
>>
>> * HotSpot inherently can't comply to the aliasing rules, as those 
>> rules are only defined in terms of C++ accesses interacting with each 
>> other. Since we JIT code performing accesses on the same memory as 
>> the C++ code, the aliasing rules can inherently never be trusted, as 
>> our interactions cross language barriers.
>> * Compilers used to compile HotSpot have all been told to ignore 
>> aliasing rules, and hence the behaviour of doing so is well defined. 
>> Because it has to be. If a compiler can't ignore aliasing, it can't 
>> compile HotSpot.
>> * Even if we were not inherently tied to ignore these aliasing rules, 
>> a significantly large part of HotSpot relies on it, and we can't 
>> realistically get rid of that reliance to turn the flags off. At 
>> least not by taking huge risk that we think we caught all the places, 
>> which would be rather irresponsible.
>> * Even if we could magically get rid of this reliance and somehow 
>> rewrite all code to conform with the aliasing rules, verify that we 
>> solved it all, and switch the compiler flags ignoring aliasing off, 
>> which would be a crazy amount of work, and be very risky, the 
>> benefits are seemingly unclear. They were introduced to allow 
>> compiler optimizations. I have not seen studies with numbers showing 
>> that it improves things. I have heard vague statements that it does, 
>> but not with numbers. I have found one study - a paper from Purdue 
>> where they had run with and without -fstrict-aliasing on a number of 
>> benchmarks, and observed no benefit. And most our time is spent in 
>> JIT:ed code, so I would expect even less if anything.
>> * Given the above, HotSpot does not, can not, and never will care 
>> about aliasing. They doe not make sense in our context, and the rules 
>> simply don't apply. Therefore, we can and should ignore the aliasing 
>> rules. Caring about them "sometimes" makes no sense to me. That's why 
>> I say I don't mind violating the aliasing rules, because they simply 
>> don't apply to HotSpot.
>>
>>> Also, when looking at that code the disreputable casts so drew my eye
>>> that I very nearly missed another problem:
>>>
>>>    47   static StrongOopStorageSet _strong;
>>>    48   static WeakOopStorageSet _weak;
>>>
>>> Nothing requires those objects be placed in memory in such a way that
>>> the "all" iterator will work.
>>
>> I agree that reliance is unnecessary, and was not fond of that myself 
>> either. Solved by wrapping _strong and _weak in a struct.
>>
>> Incremental:
>> http://cr.openjdk.java.net/~eosterlund/8227054/webrev.01_02/
>>
>> Full:
>> http://cr.openjdk.java.net/~eosterlund/8227054/webrev.02/
>>
>>>>
>>>>> And an iterator whose initial "current" is invalid?  You think
>>>>> *macros* are confusing?
>>>>
>>>> That’s Java style iterators I guess. You call next until you can’t. 
>>>> Before you called next the first time, there is no current element 
>>>> that has been handed out. I don’t mind changing the iterator style 
>>>> though if you think that is confusing. It is my preferred style for 
>>>> simple linear iteration.
>>>
>>> In this case that idiom seems like it expends additional effort to
>>> potentially hide bugs.
>>
>> I don't know what you mean by that.
>>
>>> It also seems less convenient to use, though if one uses implicit
>>> booleans (as the proposed code does), that disadvantage is nullified.
>>> (I've had many occasions to want to use the declaration form of a
>>> condition, but haven't because there were strong complaints when I
>>> first tried doing so, and I've since seen it objected to when others
>>> tried.  But I found some recently added, so maybe that's no longer
>>> true?  Or maybe the previous complainers didn't notice.)
>>
>> Yeah this style is indeed only nice when using the declaration form 
>> of a condition. If anyone thinks that should not be allowed for some 
>> reason, I don't have strong opinions about having a different 
>> iterator style.
>>
>>> I have another version in progress that doesn't use x-macros and uses
>>> somewhat fewer macros (though not none, since I really dislike
>>> boiler-plate).  It isn't finished because of a power shutdown in the
>>> office over the weekend.
>>
>> Okay. I'm looking forward to seeing what you have cooked up.
>>
>> Thanks,
>> /Erik
>



More information about the hotspot-dev mailing list