On Wed, 10 Jul 2024 09:41:37 GMT, Axel Boldt-Christmas <abold...@openjdk.org> 
wrote:

>> src/hotspot/share/runtime/lightweightSynchronizer.cpp line 763:
>> 
>>> 761:   assert(mark.has_monitor(), "must be");
>>> 762:   // The monitor exists
>>> 763:   ObjectMonitor* monitor = ObjectSynchronizer::read_monitor(current, 
>>> object, mark);
>> 
>> This looks in the table for the monitor in UseObjectMonitorTable, but could 
>> it first check the BasicLock?  Or we got here because BasicLock.metadata was 
>> not the ObjectMonitor?
>
>> This looks in the table for the monitor in UseObjectMonitorTable, but could 
>> it first check the BasicLock?
> 
> We could. 
> 
>> Or we got here because BasicLock.metadata was not the ObjectMonitor?
> 
> That is one reason we got here. We also get here from C1/interpreter as well 
> as if there are other threads on the entry queues. 
> 
> I think there was an assumption that it would not be that crucial in those 
> cases.
> 
> One off the reasons we do not read the `BasicLock` cache from the runtime is 
> that we are not as careful with keeping the `BasicLock` initialised on 
> platforms without `UseObjectMonitorTable`. The idea was that as long as they 
> call into the VM, we do not need to keep it invariant. 
> 
> But this made me realise `BasicLock::print_on` will be broken on non 
> x86/aarch64 platforms if running with `UseObjectMonitorTable`. 
> 
> Rather then fix all platforms I will condition 
> BasicLock::object_monitor_cache to return nullptr on not supported platforms. 
> 
> Could add this then. Should probably add an overload to 
> `ObjectSynchronizer::read_monitor` which takes the lock and push i all the 
> way here.

I think I'd prefer not another overloading of read_monitor.  It's kind of 
confusing as is.  This is okay and we'll see if there's any performance benefit 
to checking BasicLock instead later.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/20067#discussion_r1673993770

Reply via email to