On Wed, 25 Sep 2024 00:11:32 GMT, Ioi Lam <ik...@openjdk.org> wrote:

>> Calvin Cheung has updated the pull request incrementally with one additional 
>> commit since the last revision:
>> 
>>   fix indentation
>
> src/hotspot/share/cds/filemap.cpp line 956:
> 
>> 954:   }
>> 955:   // module paths are stored in sorted order in the CDS archive.
>> 956:   module_paths->sort(ClassLoaderExt::compare_module_path_by_name);
> 
> I think it's better to put this call inside 
> `ClassLoaderExt::extract_jar_files_from_path`

My thinking was since the function may return false at line 953, the entries in 
the `module_paths` doesn't need to be sorted until before calling 
`check_paths()`. Anyway, I've made the change you suggested.

> src/hotspot/share/cds/heapShared.cpp line 879:
> 
>> 877: 
>> 878:   ResourceMark rm(THREAD);
>> 879:   if ((strcmp(k->name()->as_C_string(), 
>> "jdk/internal/module/ArchivedModuleGraph") == 0) &&
> 
> You can avoid the ResourceMark by
> 
> 
> if (k->name()->equals("jdk/internal/module/ArchivedModuleGraph")

Done.

> src/hotspot/share/cds/heapShared.cpp line 885:
> 
>> 883:     log_info(cds, heap)("Skip initializing ArchivedModuleGraph 
>> subgraph: is_using_optimized_module_handling=%s num_module_paths=%d",
>> 884:                         
>> BOOL_TO_STR(CDSConfig::is_using_optimized_module_handling()), 
>> ClassLoaderExt::num_module_paths());
>> 885:     return;
> 
> I think we can add a comment like:
> 
> 
> ArchivedModuleGraph was created with a --module-path that's different than 
> the runtime --module-path.
> Thus, it might contain references to modules that do not exist in runtime. We 
> cannot use it.

Added the comment.

> src/hotspot/share/classfile/classLoader.cpp line 582:
> 
>> 580:                                       false /*is_boot_append */, false 
>> /* from_class_path_attr */);
>> 581:   if (new_entry != nullptr) {
>> 582:     assert(new_entry->is_jar_file(), "module path entry %s is not a jar 
>> file", new_entry->name());
> 
> How do we guarantee that new_entry is never a JAR file? Do we never come here 
> if --module-path points to an exploded directory? A comment would be helpful.

I've added the following comment:
  `// ClassLoaderExt::process_module_table() filters out non-jar entries before 
calling this function.`

> src/hotspot/share/classfile/classLoaderExt.cpp line 152:
> 
>> 150:   DIR* dirp = os::opendir(path);
>> 151:   if (dirp == nullptr && errno == ENOTDIR && has_jar_suffix(path)) {
>> 152:     module_paths->append(path);
> 
> Does this handle the case where `path` doesn't exist?

If the `path` doesn't exist, `dirp` will be nullptr and it will go to the else 
case. I think `os::readir` on `nullptr` should return a `nullptr`. To make the 
code clearer, I've added a `nullptr` check on `dirp` in the else case.

> src/hotspot/share/classfile/classLoaderExt.cpp line 162:
> 
>> 160:         int n = os::snprintf(full_name, full_name_len, "%s%s%s", path, 
>> os::file_separator(), file_name);
>> 161:         assert((size_t)n == full_name_len - 1, "Unexpected number of 
>> characters in string");
>> 162:         module_paths->append(full_name);
> 
> Can this case be handled: --module-path=dir
> 
> - Dump time :  dir contains only mod1.jar
> - Run time :  dir contains only mod1.jar and mod2.jmod

It should work because the jmod file won't be added to the `module_paths`.

> src/hotspot/share/runtime/arguments.cpp line 347:
> 
>> 345:     }
>> 346:   }
>> 347:   return false;
> 
> Can this be simplified to `return (strcmp(key, MODULE_PROPERTY_PREFIX PATH) 
> == 0)`?

I'm not sure. Is your suggest equivalent to:
  `return (strcmp(key, "jdk.module.path"));`

> src/java.base/share/classes/jdk/internal/loader/BuiltinClassLoader.java line 
> 1092:
> 
>> 1090:     void resetArchivedStatesForAppClassLoader() {
>> 1091:         setClassPath(null);
>> 1092:         if (!moduleToReader.isEmpty()) moduleToReader.clear();
> 
> Suggestion:
> 
>         if (!moduleToReader.isEmpty()) {
>             moduleToReader.clear();
>         }
> 
> 
> Also, do we need to do the same thing for the platform loader as well?

Added braces.
The `setClassPath(null)` used to be in `ClassLoaders.AppClassLoader`. Based on 
investigations so far, the clearing of the `moduleToReader` map is required 
only for `AppClassLoader`.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/21048#discussion_r1776147825
PR Review Comment: https://git.openjdk.org/jdk/pull/21048#discussion_r1776147896
PR Review Comment: https://git.openjdk.org/jdk/pull/21048#discussion_r1776147991
PR Review Comment: https://git.openjdk.org/jdk/pull/21048#discussion_r1776148021
PR Review Comment: https://git.openjdk.org/jdk/pull/21048#discussion_r1776148168
PR Review Comment: https://git.openjdk.org/jdk/pull/21048#discussion_r1776148232
PR Review Comment: https://git.openjdk.org/jdk/pull/21048#discussion_r1776148308
PR Review Comment: https://git.openjdk.org/jdk/pull/21048#discussion_r1776148461

Reply via email to