RFR: 8367475: Incorrect lock usage in LambdaFormInvokers::regenerate_holder_classes

Ioi Lam iklam at openjdk.org
Fri Sep 12 03:25:13 UTC 2025


On Fri, 12 Sep 2025 02:37:33 GMT, David Holmes <dholmes at openjdk.org> wrote:

>> The assert happens because we attempt to allocate Java objects while holding a mutex:
>> 
>> 
>>     MutexLocker ml(Thread::current(), LambdaFormInvokers_lock);
>>     list_lines = oopFactory::new_objArray_handle(vmClasses::String_klass(), len, CHECK);
>>     for (int i = 0; i < len; i++) {
>>       Handle h_line = java_lang_String::create_from_str(_lambdaform_lines->at(i), CHECK);
>> 
>> 
>> It's possible for the allocations to trigger a call to Java when JVMTI is enabled.
>> 
>> The fix is to do the allocation outside of the mutex. However, we still use the mutex to make sure we have a consistent view of `_lambdaform_lines`, which may be modified by concurrent Java threads.
>
> src/hotspot/share/cds/cdsConfig.cpp line 870:
> 
>> 868: bool CDSConfig::current_thread_is_dumper() {
>> 869:   Thread* t = Thread::current();
>> 870:   return t != nullptr && t == _dumper_thread;
> 
> Do you really need the null check here? How could an unattached thread be executing this?

I am not sure, but it surely doesn't hurt. I want to make sure that if this is called when `_dumper_thread` is not initialized, we will return `false` for any thread.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/27231#discussion_r2342846105


More information about the hotspot-runtime-dev mailing list