8073423: Remove LazyClassPathEntry support if no longer needed

Remove LazyClassPathEntry support and deprecate -XX:+LazyBootClassLoader

Reviewed-by: acorn, lfoltan
This commit is contained in:
Harold Seigel 2015-06-29 11:48:27 -04:00
parent 1a534420a8
commit 28effe7632
4 changed files with 29 additions and 150 deletions

View file

@ -156,10 +156,6 @@ ClassPathEntry::ClassPathEntry() {
} }
bool ClassPathEntry::is_lazy() {
return false;
}
ClassPathDirEntry::ClassPathDirEntry(const char* dir) : ClassPathEntry() { ClassPathDirEntry::ClassPathDirEntry(const char* dir) : ClassPathEntry() {
char* copy = NEW_C_HEAP_ARRAY(char, strlen(dir)+1, mtClass); char* copy = NEW_C_HEAP_ARRAY(char, strlen(dir)+1, mtClass);
strcpy(copy, dir); strcpy(copy, dir);
@ -276,80 +272,6 @@ void ClassPathZipEntry::contents_do(void f(const char* name, void* context), voi
} }
} }
LazyClassPathEntry::LazyClassPathEntry(const char* path, const struct stat* st, bool throw_exception) : ClassPathEntry() {
_path = os::strdup_check_oom(path);
_st = *st;
_resolved_entry = NULL;
_has_error = false;
_throw_exception = throw_exception;
}
LazyClassPathEntry::~LazyClassPathEntry() {
os::free((void*)_path);
}
bool LazyClassPathEntry::is_jar_file() {
size_t len = strlen(_path);
if (len < 4 || strcmp(_path + len - 4, ".jar") != 0) return false;
return ((_st.st_mode & S_IFREG) == S_IFREG);
}
ClassPathEntry* LazyClassPathEntry::resolve_entry(TRAPS) {
if (_resolved_entry != NULL) {
return (ClassPathEntry*) _resolved_entry;
}
ClassPathEntry* new_entry = NULL;
new_entry = ClassLoader::create_class_path_entry(_path, &_st, false, _throw_exception, CHECK_NULL);
if (!_throw_exception && new_entry == NULL) {
assert(!HAS_PENDING_EXCEPTION, "must be");
return NULL;
}
{
ThreadCritical tc;
if (_resolved_entry == NULL) {
_resolved_entry = new_entry;
return new_entry;
}
}
assert(_resolved_entry != NULL, "bug in MT-safe resolution logic");
delete new_entry;
return (ClassPathEntry*) _resolved_entry;
}
ClassFileStream* LazyClassPathEntry::open_stream(const char* name, TRAPS) {
if (_has_error) {
return NULL;
}
ClassPathEntry* cpe = resolve_entry(THREAD);
if (cpe == NULL) {
_has_error = true;
return NULL;
} else {
return cpe->open_stream(name, THREAD);
}
}
bool LazyClassPathEntry::is_lazy() {
return true;
}
u1* LazyClassPathEntry::open_entry(const char* name, jint* filesize, bool nul_terminate, TRAPS) {
if (_has_error) {
return NULL;
}
ClassPathEntry* cpe = resolve_entry(THREAD);
if (cpe == NULL) {
_has_error = true;
return NULL;
} else if (cpe->is_jar_file()) {
return ((ClassPathZipEntry*)cpe)->open_entry(name, filesize, nul_terminate,THREAD);
} else {
ShouldNotReachHere();
*filesize = 0;
return NULL;
}
}
ClassPathImageEntry::ClassPathImageEntry(ImageFileReader* image) : ClassPathImageEntry::ClassPathImageEntry(ImageFileReader* image) :
ClassPathEntry(), ClassPathEntry(),
_image(image), _image(image),
@ -564,11 +486,8 @@ void ClassLoader::setup_search_path(const char *class_path) {
} }
ClassPathEntry* ClassLoader::create_class_path_entry(const char *path, const struct stat* st, ClassPathEntry* ClassLoader::create_class_path_entry(const char *path, const struct stat* st,
bool lazy, bool throw_exception, TRAPS) { bool throw_exception, TRAPS) {
JavaThread* thread = JavaThread::current(); JavaThread* thread = JavaThread::current();
if (lazy) {
return new LazyClassPathEntry(path, st, throw_exception);
}
ClassPathEntry* new_entry = NULL; ClassPathEntry* new_entry = NULL;
if ((st->st_mode & S_IFREG) == S_IFREG) { if ((st->st_mode & S_IFREG) == S_IFREG) {
// Regular file, should be a zip or image file // Regular file, should be a zip or image file
@ -586,34 +505,35 @@ ClassPathEntry* ClassLoader::create_class_path_entry(const char *path, const str
if (image != NULL) { if (image != NULL) {
new_entry = new ClassPathImageEntry(image); new_entry = new ClassPathImageEntry(image);
} else { } else {
char* error_msg = NULL; char* error_msg = NULL;
jzfile* zip; jzfile* zip;
{ {
// enable call to C land // enable call to C land
ThreadToNativeFromVM ttn(thread); ThreadToNativeFromVM ttn(thread);
HandleMark hm(thread); HandleMark hm(thread);
zip = (*ZipOpen)(canonical_path, &error_msg); zip = (*ZipOpen)(canonical_path, &error_msg);
}
if (zip != NULL && error_msg == NULL) {
new_entry = new ClassPathZipEntry(zip, path);
} else {
ResourceMark rm(thread);
char *msg;
if (error_msg == NULL) {
msg = NEW_RESOURCE_ARRAY(char, strlen(path) + 128); ;
jio_snprintf(msg, strlen(path) + 127, "error in opening JAR file %s", path);
} else {
int len = (int)(strlen(path) + strlen(error_msg) + 128);
msg = NEW_RESOURCE_ARRAY(char, len); ;
jio_snprintf(msg, len - 1, "error in opening JAR file <%s> %s", error_msg, path);
} }
if (throw_exception) { if (zip != NULL && error_msg == NULL) {
THROW_MSG_(vmSymbols::java_lang_ClassNotFoundException(), msg, NULL); new_entry = new ClassPathZipEntry(zip, path);
} else { } else {
return NULL; ResourceMark rm(thread);
char *msg;
if (error_msg == NULL) {
msg = NEW_RESOURCE_ARRAY(char, strlen(path) + 128); ;
jio_snprintf(msg, strlen(path) + 127, "error in opening JAR file %s", path);
} else {
int len = (int)(strlen(path) + strlen(error_msg) + 128);
msg = NEW_RESOURCE_ARRAY(char, len); ;
jio_snprintf(msg, len - 1, "error in opening JAR file <%s> %s", error_msg, path);
}
// Don't complain about bad jar files added via -Xbootclasspath/a:.
if (throw_exception && is_init_completed()) {
THROW_MSG_(vmSymbols::java_lang_ClassNotFoundException(), msg, NULL);
} else {
return NULL;
}
} }
} }
}
if (TraceClassLoading || TraceClassPaths) { if (TraceClassLoading || TraceClassPaths) {
tty->print_cr("[Opened %s]", path); tty->print_cr("[Opened %s]", path);
} }
@ -690,7 +610,7 @@ bool ClassLoader::update_class_path_entry_list(const char *path,
// File or directory found // File or directory found
ClassPathEntry* new_entry = NULL; ClassPathEntry* new_entry = NULL;
Thread* THREAD = Thread::current(); Thread* THREAD = Thread::current();
new_entry = create_class_path_entry(path, &st, LazyBootClassLoader, throw_exception, CHECK_(false)); new_entry = create_class_path_entry(path, &st, throw_exception, CHECK_(false));
if (new_entry == NULL) { if (new_entry == NULL) {
return false; return false;
} }
@ -1343,19 +1263,6 @@ bool ClassPathZipEntry::is_jrt() {
return false; return false;
} }
void LazyClassPathEntry::compile_the_world(Handle loader, TRAPS) {
ClassPathEntry* cpe = resolve_entry(THREAD);
if (cpe != NULL) {
cpe->compile_the_world(loader, CHECK);
}
}
bool LazyClassPathEntry::is_jrt() {
Thread* THREAD = Thread::current();
ClassPathEntry* cpe = resolve_entry(THREAD);
return (cpe != NULL) ? cpe->is_jar_file() : false;
}
void ClassLoader::compile_the_world() { void ClassLoader::compile_the_world() {
EXCEPTION_MARK; EXCEPTION_MARK;
HandleMark hm(THREAD); HandleMark hm(THREAD);

View file

@ -53,7 +53,6 @@ class ClassPathEntry: public CHeapObj<mtClass> {
virtual bool is_jar_file() = 0; virtual bool is_jar_file() = 0;
virtual const char* name() = 0; virtual const char* name() = 0;
virtual ImageFileReader* image() = 0; virtual ImageFileReader* image() = 0;
virtual bool is_lazy();
// Constructor // Constructor
ClassPathEntry(); ClassPathEntry();
// Attempt to locate file_name through this class path entry. // Attempt to locate file_name through this class path entry.
@ -113,30 +112,6 @@ class ClassPathZipEntry: public ClassPathEntry {
}; };
// For lazier loading of boot class path entries
class LazyClassPathEntry: public ClassPathEntry {
private:
const char* _path; // dir or file
struct stat _st;
bool _has_error;
bool _throw_exception;
volatile ClassPathEntry* _resolved_entry;
ClassPathEntry* resolve_entry(TRAPS);
public:
bool is_jar_file();
const char* name() { return _path; }
ImageFileReader* image() { return NULL; }
LazyClassPathEntry(const char* path, const struct stat* st, bool throw_exception);
virtual ~LazyClassPathEntry();
u1* open_entry(const char* name, jint* filesize, bool nul_terminate, TRAPS);
ClassFileStream* open_stream(const char* name, TRAPS);
virtual bool is_lazy();
// Debugging
NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
NOT_PRODUCT(bool is_jrt();)
};
// For java image files // For java image files
class ClassPathImageEntry: public ClassPathEntry { class ClassPathImageEntry: public ClassPathEntry {
private: private:
@ -168,7 +143,6 @@ class ClassLoader: AllStatic {
package_hash_table_size = 31 // Number of buckets package_hash_table_size = 31 // Number of buckets
}; };
protected: protected:
friend class LazyClassPathEntry;
// Performance counters // Performance counters
static PerfCounter* _perf_accumulated_time; static PerfCounter* _perf_accumulated_time;
@ -233,7 +207,7 @@ class ClassLoader: AllStatic {
static void load_zip_library(); static void load_zip_library();
static ClassPathEntry* create_class_path_entry(const char *path, const struct stat* st, static ClassPathEntry* create_class_path_entry(const char *path, const struct stat* st,
bool lazy, bool throw_exception, TRAPS); bool throw_exception, TRAPS);
// Canonicalizes path names, so strcmp will work properly. This is mainly // Canonicalizes path names, so strcmp will work properly. This is mainly
// to avoid confusing the zip library // to avoid confusing the zip library

View file

@ -275,6 +275,7 @@ static ObsoleteFlag obsolete_jvm_flags[] = {
{ "AdaptiveSizePausePolicy", JDK_Version::jdk(9), JDK_Version::jdk(10) }, { "AdaptiveSizePausePolicy", JDK_Version::jdk(9), JDK_Version::jdk(10) },
{ "ParallelGCRetainPLAB", JDK_Version::jdk(9), JDK_Version::jdk(10) }, { "ParallelGCRetainPLAB", JDK_Version::jdk(9), JDK_Version::jdk(10) },
{ "ThreadSafetyMargin", JDK_Version::jdk(9), JDK_Version::jdk(10) }, { "ThreadSafetyMargin", JDK_Version::jdk(9), JDK_Version::jdk(10) },
{ "LazyBootClassLoader", JDK_Version::jdk(9), JDK_Version::jdk(10) },
{ NULL, JDK_Version(0), JDK_Version(0) } { NULL, JDK_Version(0), JDK_Version(0) }
}; };

View file

@ -1358,9 +1358,6 @@ public:
develop(uintx, PreallocatedOutOfMemoryErrorCount, 4, \ develop(uintx, PreallocatedOutOfMemoryErrorCount, 4, \
"Number of OutOfMemoryErrors preallocated with backtrace") \ "Number of OutOfMemoryErrors preallocated with backtrace") \
\ \
product(bool, LazyBootClassLoader, true, \
"Enable/disable lazy opening of boot class path entries") \
\
product(bool, UseXMMForArrayCopy, false, \ product(bool, UseXMMForArrayCopy, false, \
"Use SSE2 MOVQ instruction for Arraycopy") \ "Use SSE2 MOVQ instruction for Arraycopy") \
\ \