--- a/hotspot/src/share/vm/memory/filemap.cpp Tue Mar 15 13:48:21 2016 -0700
+++ b/hotspot/src/share/vm/memory/filemap.cpp Thu Mar 17 19:04:01 2016 +0000
@@ -226,12 +226,21 @@
SharedClassUtil::update_shared_classpath(cpe, ent, st.st_mtime, st.st_size, THREAD);
} else {
struct stat st;
- if ((os::stat(name, &st) == 0) && ((st.st_mode & S_IFDIR) == S_IFDIR)) {
- if (!os::dir_is_empty(name)) {
- ClassLoader::exit_with_path_failure("Cannot have non-empty directory in archived classpaths", name);
+ if (os::stat(name, &st) == 0) {
+ if (cpe->is_jrt()) {
+ // it's the "modules" jimage
+ ent->_timestamp = st.st_mtime;
+ ent->_filesize = st.st_size;
+ } else if ((st.st_mode & S_IFDIR) == S_IFDIR) {
+ if (!os::dir_is_empty(name)) {
+ ClassLoader::exit_with_path_failure(
+ "Cannot have non-empty directory in archived classpaths", name);
+ }
+ ent->_filesize = -1;
}
- ent->_filesize = -1;
- } else {
+ }
+ if (ent->_filesize == 0) {
+ // unknown
ent->_filesize = -2;
}
}
@@ -282,7 +291,7 @@
fail_continue("directory is not empty: %s", name);
ok = false;
}
- } else if (ent->is_jar()) {
+ } else if (ent->is_jar_or_bootimage()) {
if (ent->_timestamp != st.st_mtime ||
ent->_filesize != st.st_size) {
ok = false;
@@ -291,7 +300,7 @@
"Timestamp mismatch" :
"File size mismatch");
} else {
- fail_continue("A jar file is not the one used while building"
+ fail_continue("A jar/jimage file is not the one used while building"
" the shared archive file: %s", name);
}
}
@@ -871,6 +880,11 @@
return false;
}
+ if (Arguments::patch_dirs() != NULL) {
+ FileMapInfo::fail_continue("The shared archive file cannot be used with -Xpatch.");
+ return false;
+ }
+
if (_version != current_version()) {
FileMapInfo::fail_continue("The shared archive file is the wrong version.");
return false;