RFR(s): 8228758: assert(_no_handle_mark_nesting == 0) failed: allocating handle inside NoHandleMark

Robbin Ehn robbin.ehn at oracle.com
Tue Sep 3 12:43:51 UTC 2019


Hi David,

Truncated:

> 
> You stated that if you need to not use any handleMarks then you most likely 
> don't want polls - and no polls is what a LEAF routine has to guarantee:
> 
> QUICK -> No handles -> no polls == LEAF

I'll look at the other way around:
QUICK can have polls therefore they cannot be leafs.
(at least the one triggering this assert)

> 
>> Since we missing the cleaner, accidentally using a HandleMark would lead to a 
>> leak. The NoHandleMark protected against this leak.
> 
> Maybe I'm misunderstanding exactly how HandleMarks nest and behave. I would have 
> thought this nesting would be allowed:
> 
> entry_point
>    NoHandleMark
>    -> subroutine
>       HandleMark  // prevents leak of Handle to outer scope
>       allocate handle
> 
> whereas this would cause an error
> 
> entry_point
>    NoHandleMark
>    -> subroutine
>       allocate handle
> 
> but IIUC a NoHandleMark prevents all and any handle use in its own scope or a 
> nest scope - no?

Yes, sorry, NoHandleMark increments _no_handle_mark_nesting and
HandleArea::allocate_handle checks that it is 0, otherwise this assert.
(it also checks that _handle_mark_nesting is larger than 0, so it must be inside 
a HandleMark)

> 
> I'm not sure that is viable, or the right way to try and address this. In the 
> extreme it would require all VM susbsystems to be fully re-entrant and that is 
> not a reasonable expectation.

We already have that today with safepoint, many parts of subsystems can't handle
safepoints. The one adding the new code to be run in a handshake must make sure
that works. Not saying we should be able to run anything in a handshake, but
fundamental things like Handles should be allowed.

> 
>> This changes the polling model a bit and we have not proper look at this.
>> Maybe we should add the constraints to the poll and to find any potential
>> troublesome polls.
> 
> I'm not sure how we would discover the problems until we have a handshake that 
> executes some code that violates a constraint. The constraints themselves are 
> not obvious. Subsystems do not clearly identify themselves as being reentrant or 
> not - most things are not reentrant by their nature.

As we do with safepoints, NoSafepointVerifier (since it covers both cases).

/Robbin

> 
> Cheers,
> David
> 
>> Thanks, Robbin
>>
>>>
>>> Thanks,
>>> David
>>> -----
>>>
>>>>
>>>> Thanks, Robbin
>>>>
>>>> Some extra words about NoHandleMark:
>>>> I believe NoHandleMark should be removed.
>>>> In the LEAF case, there is no point in creating a Handle within a
>>>> NoSafepointVerifier, since we don't safepoint.
>>>> The other usecase seems to be, I'm in java don't do VM things, and someone 
>>>> tried
>>>> to protected that with a NoHandleMark. There many ways to create a much more
>>>> robust check for that.
>>>> But a discussion for another time.
>>>>
>>>>
>>>>>
>>>>> Thanks,
>>>>> David
>>>>>
>>>>>> Issue:
>>>>>> https://bugs.openjdk.java.net/browse/JDK-8228758
>>>>>>
>>>>>> Changeset:
>>>>>> http://cr.openjdk.java.net/~rehn/8228758/webrev/
>>>>>>
>>>>>> Passes t1-3 (and performance benchmarks)
>>>>>>
>>>>>> Thanks, Robbin


More information about the hotspot-runtime-dev mailing list