RFR: 8273152: Refactor CDS FileMapHeader loading code [v4]
Ioi Lam
iklam at openjdk.java.net
Mon Oct 4 21:37:10 UTC 2021
On Mon, 4 Oct 2021 17:50:27 GMT, Yumin Qi <minqi at openjdk.org> wrote:
>> Please review,
>> Refactor fundamental CDS FileMapHeader code for reliable reading of basic info from shared archive.
>> With the change, it makes it possible to read an archive generated by different version of hotspot. Also it is possible to automatically generate a CDS archive If the archive supplied is not readable or fails to pass the check.
>>
>> Tests: tier1-4
>> jtreg on sa.
>>
>> Thanks
>> Yumin
>
> Yumin Qi has updated the pull request incrementally with one additional commit since the last revision:
>
> Fixed comment
Changes requested by iklam (Reviewer).
src/hotspot/share/cds/filemap.cpp line 173:
> 171: memset((void*)this, 0, sizeof(FileMapInfo));
> 172: _is_static = is_static;
> 173: size_t c_header_size;
FileMapInfo::FileMapInfo() is called in two places:
(1) When reading an archive -- _header should not be initialized here. It should be done inside FileMapInfo::init_from_file.
(2) When writing an archive -- I think we should move the _header initialization to FileMapInfo::populate_header().
src/hotspot/share/cds/filemap.cpp line 197:
> 195: _header->set_base_archive_path_offset(0);
> 196: _header->set_base_archive_name_size(0);
> 197: _header->set_header_size((unsigned int)header_size);
The above 3 lines can be replaced by lines 203 .. 205, and 203 .. 205 can be deleted.
src/hotspot/share/cds/filemap.cpp line 200:
> 198: _header->set_has_platform_or_app_classes(true);
> 199: if (!is_static) {
> 200: _header->set_base_archive_is_default(FLAG_IS_DEFAULT(SharedArchiveFile));
There's no need for a separate _base_archive_is_default field. We are using the base archive if base_archive_name_size == 0.
src/hotspot/share/cds/filemap.cpp line 1057:
> 1055: GenericCDSFileMapHeader* header = (GenericCDSFileMapHeader*)os::malloc(sz, mtInternal);
> 1056: memset((void*)header, 0, sz);
> 1057: size_t n = os::read(fd, (void*)header, (unsigned int)sz);
There are currently 3 different places where we read the GenericCDSFileMapHeader, find out the size, and then read the real header.
- FileMapInfo::get_base_archive_name_from_header
- FileMapInfo::check_archive
- FileMapInfo::init_from_file
I think these should be consolidated into a single function.
-------------
PR: https://git.openjdk.java.net/jdk/pull/5768
More information about the serviceability-dev
mailing list