Request for Review (xs) - 8077301: Optimized build is broken

Bengt Rutisson bengt.rutisson at oracle.com
Fri Apr 10 07:27:43 UTC 2015


Hi Jon,

Thanks for confirming that I understood the problem correctly. I think 
you make a valid point of moving the compilation boundary up rather than 
down as I suggested. So, your latest webrev looks good to me. Reviewed.

Just for the record I think it is unfortunate that NOT_DEBUG_RETURN 
isn't called NOT_ASSERT_RETURN. The confusion around the PRODUCT and 
ASSERT defines is enough without having the extra concept of "debug". 
(Similarly DEBUG_ONLY, debug_only and NOT_DEBUG are badly named in my 
opinion.)

Thanks,
Bengt

On 2015-04-10 00:05, Jon Masamitsu wrote:
> Bengt,
>
> On 4/9/2015 9:48 AM, Bengt Rutisson wrote:
>>
>> Hi Jon,
>>
>> Can you explain more about the problem? I don't really follow the 
>> issue here.
>>
>> In the original code we have:
>>
>> thread.hpp:
>> static void assert_all_threads_claimed() PRODUCT_RETURN;
>>
>> thread.cpp:
>>  #ifndef PRODUCT
>>  void Threads::assert_all_threads_claimed() {
>>  ...
>> #endif // PRODUCT
>>
>> strongRootsScope.cpp:
>> StrongRootsScope::~StrongRootsScope() {
>>   Threads::assert_all_threads_claimed();
>> }
>>
>>
>> It seems like it is all using the same guard (PRODUCT)? Why is this a 
>> problem for optimized builds? I thought optimized was that neither 
>> PRODUCT nor ASSERT is defined.  So, I would expect an optimized build 
>> to use the implementation in thread.cpp. Why doesn't it find that?
>
> You mean that an optimized build would use
>
> #ifndef PRODUCT
> void Threads::assert_all_threads_claimed() {
>   ALL_JAVA_THREADS(p) {
>     const int thread_parity = p->oops_do_parity();
>     assert((thread_parity == _thread_claim_parity),
>         err_msg("Thread " PTR_FORMAT " has incorrect parity %d != %d", 
> p2i(p), thread_parity, _thread_claim_parity));
>   }
> }
> #endif // PRODUCT
>
> which it does.   Which has the oops_do_parity() method call which you 
> discuss below.
>
>>
>>
>> I think the issue is that Threads::assert_all_threads_claimed() calls 
>> Thread::oops_do_parity(), which is only defined for ASSERT builds. Is 
>> that the real problem? 
>
> Yes, that's the root problem.
>
>> In that case a different approach would be to make 
>> Thread::oops_do_parity() be PRODUCT_RETURN. Something like:
>
> What you suggest below works as you say.   I like drawing the 
> compile-in or NOT compile-in
> box around assert_all_threads_claimed() just because the name makes it 
> so clear to me that
> it should only be compiled-in for builds were I expect assertion 
> checking to be done.
>>
>> diff --git a/src/share/vm/runtime/thread.cpp 
>> b/src/share/vm/runtime/thread.cpp
>> --- a/src/share/vm/runtime/thread.cpp
>> +++ b/src/share/vm/runtime/thread.cpp
>> @@ -843,2 +843,6 @@
>>
>> +int Thread::oops_do_parity() const {
>> +  return _oops_do_parity;
>> +}
>> +
>>  // The flag: potential_vm_operation notifies if this particular 
>> safepoint state could potential
>> diff --git a/src/share/vm/runtime/thread.hpp 
>> b/src/share/vm/runtime/thread.hpp
>> --- a/src/share/vm/runtime/thread.hpp
>> +++ b/src/share/vm/runtime/thread.hpp
>> @@ -553,3 +553,2 @@
>>    bool owns_locks_but_compiled_lock() const;
>> -  int oops_do_parity() const                     { return 
>> _oops_do_parity; }
>>
>> @@ -561,2 +560,4 @@
>>
>> +  int oops_do_parity() const PRODUCT_RETURN;
>> +
>>    void check_for_valid_safepoint_state(bool potential_vm_operation) 
>> PRODUCT_RETURN;
>
> oops_do_parity() is an accessor and it suffers from the inconsistency 
> of using accessors.  I always
> like to use them (inside the class where it could be accessed as a 
> private variable as well as outside
> the class where some public access is needed).  This is more in the 
> eye of the beholder than most
> but it looks wrong to me to have a PRODUCT_RETURN on an accessor.
>
>>
>>
>> I think I prefer this since it more directly addresses what the 
>> problem is.
>>
>> With the above patch "optimized" builds on my linux machine at least. 
>> I guess the argument could be made that all of this should be guarded 
>> by ASSERT rather than PRODUCT, but that's a different issue than 
>> making the optimized builds work. 
> I think that the inconsistency of using #ifndef PRODUCT rather than 
> #ifdef ASSERT is the root of
> the problems with optimiized builds.
>
> As I said above the name "assert" in the name 
> assert_all_threads_claimed() tells me that I
> can define it under #ifdef ASSERT.  I like that but I'll willing to go 
> the oops_do_parity() route
> if you see more value in it.  Think about it and let me know.
>
> Thanks for looking at this.
>
> Jon
>
>
>> The thread.cpp/hpp files are just like all other hotspot files - 
>> rather inconsistent in their use of PRODUCT and ASSERT.
>>
>> Thanks,
>> Bengt
>>
>>
>>
>> On 2015-04-09 18:18, Jon Masamitsu wrote:
>>>
>>> Kim,
>>>
>>> Thanks for looking at this.
>>>
>>> On 4/8/2015 10:26 PM, Kim Barrett wrote:
>>>> On Apr 8, 2015, at 10:42 PM, Jon Masamitsu 
>>>> <jon.masamitsu at oracle.com> wrote:
>>>>> https://bugs.openjdk.java.net/browse/JDK-8077301
>>>>>
>>>>> The "optimized" target does not build.   A method is used in an 
>>>>> assert
>>>>> but is defined under #ifndef PRODUCT and should be defined under
>>>>> #ifdef  ASSERT.
>>>>>
>>>>> http://cr.openjdk.java.net/~jmasa/8077301/webrev.00/
>>>>>
>>>>> I built optimized, fastdebug, and product successfully after
>>>>> the fix.
>>>> This change seems inconsistent with the function declaration in the 
>>>> header, which is
>>>>
>>>>    static void assert_all_threads_claimed() PRODUCT_RETURN;
>>>>
>>>> Maybe the declaration should be changed to NOT_DEBUG_RETURN too?
>>>
>>> Yes that makes more sense.  I've changed to  NOT_DEBUG_RETURN.
>>>>
>>>> I’m also confused about how “optimized” would build with the 
>>>> proposed change.  I thought
>>>> “optimized” means neither PRODUCT nor ASSERT are defined.  I see 
>>>> how that would fail
>>>> without the change, due to an unused variable warning, because the 
>>>> variable is only used
>>>> in an assert.  But with this change I would expect to see a 
>>>> link-time error because the
>>>> function is referenced but lacks a definition.
>>>
>>> You're right again.  I was overly confident that it would work once 
>>> it compiled.  With the
>>> change to use  NOT_DEBUG_RETURN, it builds and executes.
>>>
>>> Fixed webrev.
>>>
>>> http://cr.openjdk.java.net/~jmasa/8077301/webrev.01/
>>>
>>> Jon
>>>
>>>>
>>>
>>
>



More information about the hotspot-gc-dev mailing list