RFR (L) JDK-8154239: -Xbootclasspath/a breaks exploded build
Lois Foltan
lois.foltan at oracle.com
Thu Jul 21 21:11:46 UTC 2016
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