RFR: 8263896: Remove not_suspended parameter from ObjectMonitor::exit()
patricio.chilano.mateo at oracle.com
patricio.chilano.mateo at oracle.com
Wed Mar 24 01:43:09 UTC 2021
Hi David,
On 3/23/21 4:18 AM, David Holmes wrote:
> On 23/03/2021 4:11 pm, patricio.chilano.mateo at oracle.com wrote:
>> Hi David,
>>
>> On 3/23/21 12:08 AM, David Holmes wrote:
>>> Hi Patricio,
>>>
>>> I'm in two-minds about using incidental state to infer whether to
>>> store the last_owner_tid here. Someone might reasonably argue that
>>> we should actually be clearing the pending-monitor field whilst in
>>> the self-suspend loop.
>> Right, but having _current_pending_monitor != NULL when calling
>> exit() can only happen if we are releasing the monitor from enter(),
>> which we only do in case we were suspended, so both things go hand in
>> hand.
>
> But they only happen to go hand-in-hand due to the way the code is
> currently structured. If I'm not mistaken you could also check that
> the thread state is _thread_blocked, or the osThread has "contend"
> state, as both of these will also only be true when the exit() call
> comes from within enter(). These are all things that happen to be
> true, but which someone could inadvertently change not realising the
> code structure was being used to indicate something to another piece
> of code.
>
>> If we want to clear _current_pending_monitor while being suspended we
>> can do it after the exit() call though and before calling
>> java_suspend_self().
>
> Yes but you have to know that it must be done after the exit() call
> rather than say:
>
> current->set_current_pending_monitor(this);
> EnterI(current);
> current->set_current_pending_monitor(NULL);
Ok, I can add an assert right before that special exit() call to check
that _current_pending_monitor is set. That will catch code refactoring
or other changes since the exit() call and the precondition check will
be right next to each other.
>>> Is this going to feed into Robbin's thread suspension changes?
>>> Otherwise I'm not really seeing the motivation.
>> Not really. It's just to avoid having to declare exit() with this
>> extra parameter that's only used for a special case that we can
>> already detect. It seems wrong to have the user calling exit() figure
>> out what this value should be.
>> Alternatively since your cleanup in 8262910, I could move it to the
>> end of the parameter list and set a default value of true. Then only
>> pass it explicitly as false for this call. (although I would prefer
>> removing it altogether and just use _current_pending_monitor : ) ).
>
> Yes a default parameter would be clearer. Personally I don't mind
> default parameters for these kind of special cases. And as you note
> previously this couldn't be a default parameter but now it can.
>
> So my vote would be for a default parameter, but if everyone prefers
> this then so be it. :)
Ok, I updated the pull request adding that assert() and the comments but
if you still prefer the default parameter way I can do that.
Thanks David!
Patricio
> Thanks,
> David
> -----
>
>>
>> Thanks,
>> Patricio
>>> Thanks,
>>> David
>>>
>>> -------------
>>>
>>> PR: https://git.openjdk.java.net/jdk/pull/3101
>>
More information about the hotspot-runtime-dev
mailing list