RFR: 8217450: Add PackageEntry::locked_lookup_only

David Holmes david.holmes at oracle.com
Tue Jan 22 21:14:27 UTC 2019



On 23/01/2019 5:35 am, Claes Redestad wrote:
> 
> 
> On 2019-01-22 18:10, Lois Foltan wrote:
>>>>
>>>> Ok - updated http://cr.openjdk.java.net/~redestad/8217450/open.01/ in
>>>> place and running some sanity tests before push.
>>>>
>>>> Thanks!
>>>>
>>>> /Claes
>>>
>>> Hi Claes,
>>>
>>> The code change in modules.cpp lines #211-214 does not look correct. 
>>> PackageEntry::locked_create_entry_or_null() will return NULL if the 
>>> package exists and has already been created.  The code at lines 
>>> #211-214 need a PackageEntry to be successfully returned for 
>>> java.base packages created during bootstrapping so we can decrement 
>>> the refcount for it appropriately.
>>
>> Just to clarify further.  Obtaining a PackageEntry itself is not a 
>> requirement for decrementing the refcount of the Symbol* within the 
>> table.  However, the assert at line #213 will trigger if 
>> PackageEntry::locked_create_entry_or_null() returns NULL for an 
>> existing package.  A PackageEntry can be created for any class loaded, 
>> such as java/lang/Class and java/lang/Object for example, during 
>> bootstrapping before java.base is defined to the JVM.  These classes 
>> are put on a fixup_module_list so that once the java.base module is 
>> defined the JVM can then fixup their java.lang.Module field to be 
>> correctly set to java.base.
> 
> Hi Lois,
> 
> thanks for looking at this!
> 
> As you say: when locked_create_entry_or_null() returns NULL this
> *should* be because the package already exists.  The assert is thus not
> asserting if pkg == NULL alone, locked_lookup_only() must also return
> NULL for the assert to trigger: i.e., I'm checking that a NULL really
> meant that the package already existed, and not something else, such as
> a failure to allocate the PackageEntry.

I'm in agreement with Claes here. In the original case the assert checks 
we created a pkg because we are in a path only executed when the package 
did not pre-exist. In the new code the assert is unconditional so the 
package may have pre-existed, which is what the second clause is now 
checking: either we successfully created a pkg, or we didn't because it 
already existed.

David
-----

> 
> I thought this was the purpose of the original assert: getting a NULL
> back from locked_create_entry_or_null() when we *know* there was no pre-
> existing package should be impossible (we're holding the lock, so that a
> NULL must be a failure to allocate or worse).
> 
> Am I missing something here?
> 
> /Claes


More information about the hotspot-runtime-dev mailing list