RFR (L) JDK-8154239: -Xbootclasspath/a breaks exploded build

Calvin Cheung calvin.cheung at oracle.com
Fri Jul 22 16:46:48 UTC 2016


Hi Lois,

Just some minor comments:

classLoader.cpp:
821   jio_snprintf(path, len, "%s%cmodules%c%s", home, file_sep, 
file_sep, module_name);

I think it is better to add a #define for "modules" since it is also 
being used in os.cpp:
1217   char* base_classes = format_boot_path("%/modules/java.base", 
home, home_len, fileSep, pathSep);
though I'm not sure if the #define will work with format_boot_path().

It's fine with me if you choose to fix it in a subsequent fix.

nit: line too long in the following:

filemap.cpp

205     assert(jrt_entry != NULL, "No modular java runtime image present 
when allocating the CDS classpath entry table");

classLoaderExt.hpp

73   static void add_class_path_entry(const char* path, bool 
check_for_duplicates, ClassPathEntry* new_entry) {

thanks,
Calvin

On 7/21/16, 2:11 PM, Lois Foltan wrote:
>
> On 7/21/2016 11:25 AM, harold seigel wrote:
>> Hi Lois,
>>
>> This is a nice fix for the exploded build system class path issues!
>>
>> If the callers of methods such as add_to_exploded_build_list() 
>> already have THREAD, can it be passed as a parameter?
> Done.
>
>>
>> In classLoader.cpp, the comment at lines 1466 - 1468 say that the 
>> starting classpath_index is  always 1.  Can you either add an assert 
>> for this or change line 1469 to just: classpath_index = 1;
> Done.
>
>>
>> In classLoader.hpp, could has_jimage()  be renamed to something like 
>> has_jrt_entry so it's not confused with the has_jimage() method in 
>> arguments.hpp?
> Done.
>
>>
>> In filemap.cpp, can the code at lines 226 - 230 be changed to:
>>
>>    assert(strptr + name_bytes <= strptr_max, "miscalculated buffer 
>> size");
>>    strncpy(...)
>>    strptr += name_bytes;
> Done.
>
> Thanks for the review Harold!  New webrev at 
> http://cr.openjdk.java.net/~lfoltan/bug_jdk8154239.1/webrev/
> Lois
>
>>
>> Thanks, Harold
>>
>>
>> On 7/19/2016 2:09 PM, Lois Foltan wrote:
>>> Hello,
>>>
>>> Please review the following fix:
>>>
>>> Webrev:
>>>     http://cr.openjdk.java.net/~lfoltan/bug_jdk8154239/webrev/
>>>
>>> Bug: -Xbootclasspath/a breaks exploded build
>>>     https://bugs.openjdk.java.net/browse/JDK-8154239
>>>
>>> Summary:
>>> The JVM was incorrectly handling how to set up and search the 
>>> ClassPathEntry's for directories representing the module definitions 
>>> in an exploded module build situation for the boot class loader. The 
>>> incorrect set up and search was particularly exposed when 
>>> -Xbootclasspath/a was specified in conjunction with a exploded 
>>> module build.  In an exploded module build, when 
>>> Modules::define_modules was called to define a module to the boot 
>>> loader, a ClassPathEntry was simply appended to the boot loader's 
>>> search list.  At load class time, a class would then be searched by 
>>> simply traversing that list without any regards to the module that 
>>> class was defined in.  This is incorrect behavior.  The class should 
>>> only be searched for in the location of the module's definition that 
>>> it was defined within.  The fix now records each module and it's 
>>> exploded build location in order to adhere to this rule.
>>>
>>> The other piece to this problem was that if -Xbootclasspath/a was 
>>> specified, it was incorrectly injected prior to the majority of 
>>> ClassPathEntry's for the exploded modules, yielding a broken and 
>>> incorrect search order for the boot loader.  Introducing the concept 
>>> of a "base" or "core" piece for the boot loader which is either the 
>>> java runtime image or the exploded modules build and changing the 
>>> ClassLoader::_first_append_entry to truly be only appended entries 
>>> added via -Xbootclasspath/a or jvmti appended entries, introduces a 
>>> clean way for how this information is stored in the ClassLoader data 
>>> structure that maps directly to how ClassLoader::load_class() 
>>> searches that information.
>>>
>>>  215   // The boot class path consists of 3 ordered pieces:
>>>  216   //  1. the module/path pairs specified to -Xpatch
>>>  217   // -Xpatch:<module>=<file>(<pathsep><file>)*
>>>  218   //  2. the base piece
>>>  219   //    [jimage | build with exploded modules]
>>>  220   //  3. boot loader append path
>>>  221   //    [-Xbootclasspath/a]; [jvmti appended entries]
>>>  222   //
>>>  223   // The boot loader must obey this order when attempting
>>>  224   // to load a class.
>>>
>>>
>>> Testing:
>>> Full hotspot nightly testing with a java runtime image build
>>> JDK java/io, java/lang, java/util with both a java runtime image and 
>>> an exploded module build
>>> JCK lang & vm with both a java runtime image and an exploded module 
>>> build
>>> Hotspot jtreg tests with both a java runtime image and an exploded 
>>> module build
>>>
>>
>


More information about the hotspot-runtime-dev mailing list