On Tue, 26 Sep 2023 02:30:25 GMT, David Holmes <dhol...@openjdk.org> wrote:

>>> Ah! I guess we get used to talking about "at a safepoint" when we really 
>>> mean "at a fixed point in time". So the VM is not necessarily at a 
>>> safepoint, but everything is fixed. So invariants may not hold, but the 
>>> state cannot change.
>> 
>> Correct!
>> 
>>> So in the current context the anonymous owner should be found ...
>> 
>> That's what I concluded based on Roman's description of how things work.
>> 
>>>  I guess the question to be answered is how the code tries to find an 
>>> anonymous owner? I'm not sure how you can find it.
>> 
>> I'm not sure yet. I'll need to have a look.
>
> AFAICS we update the owner to the real thread before we remove the object 
> from the lock stack. So if we see the object monitor is anonymously owned 
> then we should find the monitor object in a thread's lockstack.

Correction, there is one code path where we pop the lockstack first and then 
update the owner:

ObjectMonitor* monitor = inflate(current, object, inflate_cause_vm_internal);
  if (LockingMode == LM_LIGHTWEIGHT && monitor->is_owner_anonymous()) {
    // It must be owned by us. Pop lock object from lock stack.
    LockStack& lock_stack = current->lock_stack();
    oop popped = lock_stack.pop();
    assert(popped == object, "must be owned by this thread");
    monitor->set_owner_from_anonymous(current);
  }
  monitor->exit(current);

we should probably do this the other way around.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/15907#discussion_r1336558790

Reply via email to