RFR(M): 8164011: --patch-module support for CDS
Calvin Cheung
calvin.cheung at oracle.com
Tue Sep 13 04:00:04 UTC 2016
On 9/12/16, 3:20 PM, Ioi Lam wrote:
> Hi Calvin,
> *
> **src/share/vm/classfile/classLoader.cpp*
>
> There's a memory leak here - the entry is not freed:
>
> 322 bool ClassPathZipEntry::stream_exists(const char* name) {
> 323 // enable call to C land
> 324 JavaThread* thread = JavaThread::current();
> 325 ThreadToNativeFromVM ttn(thread);
> 326 // check whether zip archive contains name
> 327 jint name_len, filesize;
> 328 jzentry* entry = (*FindEntry)(_zip, name, &filesize,
> &name_len);
> 329 return (entry != NULL) ? true : false;
> 330 }
>
> I think you need to add a new function pointer like this, and call
> it if <entry> is not NULL.
> FreeEntry = CAST_TO_FN_PTR(FreeEntry_t, os::dll_lookup(handle,
> "ZIP_FreeEntry"));
>
> But, ZIP_FreeEntry (in
> jdk/src/java.base/share/native/libzip/zip_util.c) is not exported.
> To export it, you need to edit all the files under
> jdk/make/mapfiles/libzip (grep for ZIP_FindEntry as an example).
It turns out changing only jdk/make/mapfiles/libzip/mapfile-vers is enough.
The other three files already contain ZIP_FreeEntry.
While testing my change, I noticed the ReadMappedEntry in
ClassLoader::load_zip_library() is NULL:
ReadMappedEntry = CAST_TO_FN_PTR(ReadMappedEntry_t,
os::dll_lookup(handle, "ZIP_ReadMappedEntry"));
It will be used in ClassPathZipEntry::open_entry(). I did a search in
the jdk/src/java.base/share/native/libzip and couldn't find the
function. This is unrelated to the current change. I can file a separate
bug if needed.
>
> This line can be removed
> 1416 bool found;
>
> and these lines:
> 1444 found = e->stream_exists(file_name);
> 1445 if (found) {
> can be changed to "if (e->stream_exists(file_name) {"
>
> Typo on line 1489: exploeded -> exploded
>
> This variable seems to be redundant:
> 1504 bool found_patch_mod_entry = false;
>
> I think it's better to move 1523~1525 into here:
>
> 1517 #if INCLUDE_CDS
> 1518 if (is_in_patch_module(file_name)) {
> tty->print_cr("Preload Warning: Skip archiving
> class %s found in --patch-module entry", class_name);
> return NULL;
> }
> 1519 #endif
I've fixed the above.
>
> *test/runtime/modules/PatchModule/PatchModuleCDS.java**
> *
>
> I think this line should be removed. High level description of the
> test should be included as @summary in the header.
> 40 System.out.println("Test that --patch-module and
> -Xshare:dump are compatibable");
>
> Is mods/java.naming supposed to be a directory that doesn't exist? I
> don't see any code in the test that creates this. If so, it's better
> to use something like "java.naming=no/such/directory"
> 46 "--patch-module=java.naming=mods/java.naming",
I will fix the above and send a new webrev after more testing.
thanks,
Calvin
>
> Thanks
> - Ioi
>
> On 9/12/16 11:01 AM, Calvin Cheung wrote:
>> Hi,
>>
>> Please review the following change to allow the use of the
>> --patch-module option with CDS.
>>
>> bug: https://bugs.openjdk.java.net/browse/JDK-8164011
>> webrev: http://cr.openjdk.java.net/~ccheung/8164011/webrev.00/
>>
>> During dump time, this change checks if a class can be found in the
>> jar entries of the _patch_mod_entries. If so, the class won't be
>> included in the shared archive. It currently does not support non-jar
>> entries in the _patch_mod_entries.
>>
>> Tested with JPRT and hotspot/runtime tests.
>>
>> thanks,
>> Calvin
>
More information about the hotspot-runtime-dev
mailing list