src/hotspot/share/classfile/classLoader.cpp
changeset 47216 71c04702a3d5
parent 47106 bed18a111b90
child 47564 25ef5e64fd71
equal deleted inserted replaced
47215:4ebc2e2fb97c 47216:71c04702a3d5
       
     1 /*
       
     2  * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.
       
     8  *
       
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    12  * version 2 for more details (a copy is included in the LICENSE file that
       
    13  * accompanied this code).
       
    14  *
       
    15  * You should have received a copy of the GNU General Public License version
       
    16  * 2 along with this work; if not, write to the Free Software Foundation,
       
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    18  *
       
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    20  * or visit www.oracle.com if you need additional information or have any
       
    21  * questions.
       
    22  *
       
    23  */
       
    24 
       
    25 #include "precompiled.hpp"
       
    26 #include "classfile/classFileStream.hpp"
       
    27 #include "classfile/classLoader.hpp"
       
    28 #include "classfile/classLoaderData.inline.hpp"
       
    29 #include "classfile/classLoaderExt.hpp"
       
    30 #include "classfile/javaClasses.hpp"
       
    31 #include "classfile/jimage.hpp"
       
    32 #include "classfile/moduleEntry.hpp"
       
    33 #include "classfile/modules.hpp"
       
    34 #include "classfile/packageEntry.hpp"
       
    35 #include "classfile/klassFactory.hpp"
       
    36 #include "classfile/systemDictionary.hpp"
       
    37 #include "classfile/vmSymbols.hpp"
       
    38 #include "compiler/compileBroker.hpp"
       
    39 #include "gc/shared/collectedHeap.inline.hpp"
       
    40 #include "gc/shared/generation.hpp"
       
    41 #include "interpreter/bytecodeStream.hpp"
       
    42 #include "interpreter/oopMapCache.hpp"
       
    43 #include "logging/log.hpp"
       
    44 #include "logging/logStream.hpp"
       
    45 #include "logging/logTag.hpp"
       
    46 #include "memory/allocation.inline.hpp"
       
    47 #include "memory/filemap.hpp"
       
    48 #include "memory/oopFactory.hpp"
       
    49 #include "memory/resourceArea.hpp"
       
    50 #include "memory/universe.inline.hpp"
       
    51 #include "oops/instanceKlass.hpp"
       
    52 #include "oops/instanceRefKlass.hpp"
       
    53 #include "oops/objArrayOop.inline.hpp"
       
    54 #include "oops/oop.inline.hpp"
       
    55 #include "oops/symbol.hpp"
       
    56 #include "prims/jvm.h"
       
    57 #include "prims/jvm_misc.hpp"
       
    58 #include "runtime/arguments.hpp"
       
    59 #include "runtime/compilationPolicy.hpp"
       
    60 #include "runtime/handles.hpp"
       
    61 #include "runtime/handles.inline.hpp"
       
    62 #include "runtime/init.hpp"
       
    63 #include "runtime/interfaceSupport.hpp"
       
    64 #include "runtime/java.hpp"
       
    65 #include "runtime/javaCalls.hpp"
       
    66 #include "runtime/os.hpp"
       
    67 #include "runtime/threadCritical.hpp"
       
    68 #include "runtime/timer.hpp"
       
    69 #include "runtime/vm_version.hpp"
       
    70 #include "services/management.hpp"
       
    71 #include "services/threadService.hpp"
       
    72 #include "utilities/events.hpp"
       
    73 #include "utilities/hashtable.inline.hpp"
       
    74 #include "utilities/macros.hpp"
       
    75 #if INCLUDE_CDS
       
    76 #include "classfile/sharedClassUtil.hpp"
       
    77 #include "classfile/sharedPathsMiscInfo.hpp"
       
    78 #endif
       
    79 
       
    80 // Entry points in zip.dll for loading zip/jar file entries
       
    81 
       
    82 typedef void * * (JNICALL *ZipOpen_t)(const char *name, char **pmsg);
       
    83 typedef void (JNICALL *ZipClose_t)(jzfile *zip);
       
    84 typedef jzentry* (JNICALL *FindEntry_t)(jzfile *zip, const char *name, jint *sizeP, jint *nameLen);
       
    85 typedef jboolean (JNICALL *ReadEntry_t)(jzfile *zip, jzentry *entry, unsigned char *buf, char *namebuf);
       
    86 typedef jzentry* (JNICALL *GetNextEntry_t)(jzfile *zip, jint n);
       
    87 typedef jboolean (JNICALL *ZipInflateFully_t)(void *inBuf, jlong inLen, void *outBuf, jlong outLen, char **pmsg);
       
    88 typedef jint     (JNICALL *Crc32_t)(jint crc, const jbyte *buf, jint len);
       
    89 
       
    90 static ZipOpen_t         ZipOpen            = NULL;
       
    91 static ZipClose_t        ZipClose           = NULL;
       
    92 static FindEntry_t       FindEntry          = NULL;
       
    93 static ReadEntry_t       ReadEntry          = NULL;
       
    94 static GetNextEntry_t    GetNextEntry       = NULL;
       
    95 static canonicalize_fn_t CanonicalizeEntry  = NULL;
       
    96 static ZipInflateFully_t ZipInflateFully    = NULL;
       
    97 static Crc32_t           Crc32              = NULL;
       
    98 
       
    99 // Entry points for jimage.dll for loading jimage file entries
       
   100 
       
   101 static JImageOpen_t                    JImageOpen             = NULL;
       
   102 static JImageClose_t                   JImageClose            = NULL;
       
   103 static JImagePackageToModule_t         JImagePackageToModule  = NULL;
       
   104 static JImageFindResource_t            JImageFindResource     = NULL;
       
   105 static JImageGetResource_t             JImageGetResource      = NULL;
       
   106 static JImageResourceIterator_t        JImageResourceIterator = NULL;
       
   107 static JImage_ResourcePath_t           JImageResourcePath     = NULL;
       
   108 
       
   109 // Globals
       
   110 
       
   111 PerfCounter*    ClassLoader::_perf_accumulated_time = NULL;
       
   112 PerfCounter*    ClassLoader::_perf_classes_inited = NULL;
       
   113 PerfCounter*    ClassLoader::_perf_class_init_time = NULL;
       
   114 PerfCounter*    ClassLoader::_perf_class_init_selftime = NULL;
       
   115 PerfCounter*    ClassLoader::_perf_classes_verified = NULL;
       
   116 PerfCounter*    ClassLoader::_perf_class_verify_time = NULL;
       
   117 PerfCounter*    ClassLoader::_perf_class_verify_selftime = NULL;
       
   118 PerfCounter*    ClassLoader::_perf_classes_linked = NULL;
       
   119 PerfCounter*    ClassLoader::_perf_class_link_time = NULL;
       
   120 PerfCounter*    ClassLoader::_perf_class_link_selftime = NULL;
       
   121 PerfCounter*    ClassLoader::_perf_class_parse_time = NULL;
       
   122 PerfCounter*    ClassLoader::_perf_class_parse_selftime = NULL;
       
   123 PerfCounter*    ClassLoader::_perf_sys_class_lookup_time = NULL;
       
   124 PerfCounter*    ClassLoader::_perf_shared_classload_time = NULL;
       
   125 PerfCounter*    ClassLoader::_perf_sys_classload_time = NULL;
       
   126 PerfCounter*    ClassLoader::_perf_app_classload_time = NULL;
       
   127 PerfCounter*    ClassLoader::_perf_app_classload_selftime = NULL;
       
   128 PerfCounter*    ClassLoader::_perf_app_classload_count = NULL;
       
   129 PerfCounter*    ClassLoader::_perf_define_appclasses = NULL;
       
   130 PerfCounter*    ClassLoader::_perf_define_appclass_time = NULL;
       
   131 PerfCounter*    ClassLoader::_perf_define_appclass_selftime = NULL;
       
   132 PerfCounter*    ClassLoader::_perf_app_classfile_bytes_read = NULL;
       
   133 PerfCounter*    ClassLoader::_perf_sys_classfile_bytes_read = NULL;
       
   134 PerfCounter*    ClassLoader::_sync_systemLoaderLockContentionRate = NULL;
       
   135 PerfCounter*    ClassLoader::_sync_nonSystemLoaderLockContentionRate = NULL;
       
   136 PerfCounter*    ClassLoader::_sync_JVMFindLoadedClassLockFreeCounter = NULL;
       
   137 PerfCounter*    ClassLoader::_sync_JVMDefineClassLockFreeCounter = NULL;
       
   138 PerfCounter*    ClassLoader::_sync_JNIDefineClassLockFreeCounter = NULL;
       
   139 PerfCounter*    ClassLoader::_unsafe_defineClassCallCounter = NULL;
       
   140 PerfCounter*    ClassLoader::_isUnsyncloadClass = NULL;
       
   141 PerfCounter*    ClassLoader::_load_instance_class_failCounter = NULL;
       
   142 
       
   143 GrowableArray<ModuleClassPathList*>* ClassLoader::_patch_mod_entries = NULL;
       
   144 GrowableArray<ModuleClassPathList*>* ClassLoader::_exploded_entries = NULL;
       
   145 ClassPathEntry* ClassLoader::_jrt_entry = NULL;
       
   146 ClassPathEntry* ClassLoader::_first_append_entry = NULL;
       
   147 ClassPathEntry* ClassLoader::_last_append_entry  = NULL;
       
   148 int             ClassLoader::_num_entries        = 0;
       
   149 int             ClassLoader::_num_boot_entries   = -1;
       
   150 #if INCLUDE_CDS
       
   151 GrowableArray<char*>* ClassLoader::_boot_modules_array = NULL;
       
   152 GrowableArray<char*>* ClassLoader::_platform_modules_array = NULL;
       
   153 SharedPathsMiscInfo* ClassLoader::_shared_paths_misc_info = NULL;
       
   154 #endif
       
   155 
       
   156 // helper routines
       
   157 bool string_starts_with(const char* str, const char* str_to_find) {
       
   158   size_t str_len = strlen(str);
       
   159   size_t str_to_find_len = strlen(str_to_find);
       
   160   if (str_to_find_len > str_len) {
       
   161     return false;
       
   162   }
       
   163   return (strncmp(str, str_to_find, str_to_find_len) == 0);
       
   164 }
       
   165 
       
   166 static const char* get_jimage_version_string() {
       
   167   static char version_string[10] = "";
       
   168   if (version_string[0] == '\0') {
       
   169     jio_snprintf(version_string, sizeof(version_string), "%d.%d",
       
   170                  Abstract_VM_Version::vm_major_version(), Abstract_VM_Version::vm_minor_version());
       
   171   }
       
   172   return (const char*)version_string;
       
   173 }
       
   174 
       
   175 bool ClassLoader::string_ends_with(const char* str, const char* str_to_find) {
       
   176   size_t str_len = strlen(str);
       
   177   size_t str_to_find_len = strlen(str_to_find);
       
   178   if (str_to_find_len > str_len) {
       
   179     return false;
       
   180   }
       
   181   return (strncmp(str + (str_len - str_to_find_len), str_to_find, str_to_find_len) == 0);
       
   182 }
       
   183 
       
   184 // Used to obtain the package name from a fully qualified class name.
       
   185 // It is the responsibility of the caller to establish a ResourceMark.
       
   186 const char* ClassLoader::package_from_name(const char* const class_name, bool* bad_class_name) {
       
   187   if (class_name == NULL) {
       
   188     if (bad_class_name != NULL) {
       
   189       *bad_class_name = true;
       
   190     }
       
   191     return NULL;
       
   192   }
       
   193 
       
   194   if (bad_class_name != NULL) {
       
   195     *bad_class_name = false;
       
   196   }
       
   197 
       
   198   const char* const last_slash = strrchr(class_name, '/');
       
   199   if (last_slash == NULL) {
       
   200     // No package name
       
   201     return NULL;
       
   202   }
       
   203 
       
   204   char* class_name_ptr = (char*) class_name;
       
   205   // Skip over '['s
       
   206   if (*class_name_ptr == '[') {
       
   207     do {
       
   208       class_name_ptr++;
       
   209     } while (*class_name_ptr == '[');
       
   210 
       
   211     // Fully qualified class names should not contain a 'L'.
       
   212     // Set bad_class_name to true to indicate that the package name
       
   213     // could not be obtained due to an error condition.
       
   214     // In this situation, is_same_class_package returns false.
       
   215     if (*class_name_ptr == 'L') {
       
   216       if (bad_class_name != NULL) {
       
   217         *bad_class_name = true;
       
   218       }
       
   219       return NULL;
       
   220     }
       
   221   }
       
   222 
       
   223   int length = last_slash - class_name_ptr;
       
   224 
       
   225   // A class name could have just the slash character in the name.
       
   226   if (length <= 0) {
       
   227     // No package name
       
   228     if (bad_class_name != NULL) {
       
   229       *bad_class_name = true;
       
   230     }
       
   231     return NULL;
       
   232   }
       
   233 
       
   234   // drop name after last slash (including slash)
       
   235   // Ex., "java/lang/String.class" => "java/lang"
       
   236   char* pkg_name = NEW_RESOURCE_ARRAY(char, length + 1);
       
   237   strncpy(pkg_name, class_name_ptr, length);
       
   238   *(pkg_name+length) = '\0';
       
   239 
       
   240   return (const char *)pkg_name;
       
   241 }
       
   242 
       
   243 // Given a fully qualified class name, find its defining package in the class loader's
       
   244 // package entry table.
       
   245 PackageEntry* ClassLoader::get_package_entry(const char* class_name, ClassLoaderData* loader_data, TRAPS) {
       
   246   ResourceMark rm(THREAD);
       
   247   const char *pkg_name = ClassLoader::package_from_name(class_name);
       
   248   if (pkg_name == NULL) {
       
   249     return NULL;
       
   250   }
       
   251   PackageEntryTable* pkgEntryTable = loader_data->packages();
       
   252   TempNewSymbol pkg_symbol = SymbolTable::new_symbol(pkg_name, CHECK_NULL);
       
   253   return pkgEntryTable->lookup_only(pkg_symbol);
       
   254 }
       
   255 
       
   256 ClassPathDirEntry::ClassPathDirEntry(const char* dir) : ClassPathEntry() {
       
   257   char* copy = NEW_C_HEAP_ARRAY(char, strlen(dir)+1, mtClass);
       
   258   strcpy(copy, dir);
       
   259   _dir = copy;
       
   260 }
       
   261 
       
   262 
       
   263 ClassFileStream* ClassPathDirEntry::open_stream(const char* name, TRAPS) {
       
   264   // construct full path name
       
   265   char* path = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, JVM_MAXPATHLEN);
       
   266   if (jio_snprintf(path, JVM_MAXPATHLEN, "%s%s%s", _dir, os::file_separator(), name) == -1) {
       
   267     FREE_RESOURCE_ARRAY(char, path, JVM_MAXPATHLEN);
       
   268     return NULL;
       
   269   }
       
   270   // check if file exists
       
   271   struct stat st;
       
   272   if (os::stat(path, &st) == 0) {
       
   273 #if INCLUDE_CDS
       
   274     if (DumpSharedSpaces) {
       
   275       // We have already check in ClassLoader::check_shared_classpath() that the directory is empty, so
       
   276       // we should never find a file underneath it -- unless user has added a new file while we are running
       
   277       // the dump, in which case let's quit!
       
   278       ShouldNotReachHere();
       
   279     }
       
   280 #endif
       
   281     // found file, open it
       
   282     int file_handle = os::open(path, 0, 0);
       
   283     if (file_handle != -1) {
       
   284       // read contents into resource array
       
   285       u1* buffer = NEW_RESOURCE_ARRAY(u1, st.st_size);
       
   286       size_t num_read = os::read(file_handle, (char*) buffer, st.st_size);
       
   287       // close file
       
   288       os::close(file_handle);
       
   289       // construct ClassFileStream
       
   290       if (num_read == (size_t)st.st_size) {
       
   291         if (UsePerfData) {
       
   292           ClassLoader::perf_sys_classfile_bytes_read()->inc(num_read);
       
   293         }
       
   294         FREE_RESOURCE_ARRAY(char, path, JVM_MAXPATHLEN);
       
   295         // Resource allocated
       
   296         return new ClassFileStream(buffer,
       
   297                                    st.st_size,
       
   298                                    _dir,
       
   299                                    ClassFileStream::verify);
       
   300       }
       
   301     }
       
   302   }
       
   303   FREE_RESOURCE_ARRAY(char, path, JVM_MAXPATHLEN);
       
   304   return NULL;
       
   305 }
       
   306 
       
   307 ClassPathZipEntry::ClassPathZipEntry(jzfile* zip, const char* zip_name, bool is_boot_append) : ClassPathEntry() {
       
   308   _zip = zip;
       
   309   char *copy = NEW_C_HEAP_ARRAY(char, strlen(zip_name)+1, mtClass);
       
   310   strcpy(copy, zip_name);
       
   311   _zip_name = copy;
       
   312   _is_boot_append = is_boot_append;
       
   313   _multi_versioned = _unknown;
       
   314 }
       
   315 
       
   316 ClassPathZipEntry::~ClassPathZipEntry() {
       
   317   if (ZipClose != NULL) {
       
   318     (*ZipClose)(_zip);
       
   319   }
       
   320   FREE_C_HEAP_ARRAY(char, _zip_name);
       
   321 }
       
   322 
       
   323 u1* ClassPathZipEntry::open_entry(const char* name, jint* filesize, bool nul_terminate, TRAPS) {
       
   324     // enable call to C land
       
   325   JavaThread* thread = JavaThread::current();
       
   326   ThreadToNativeFromVM ttn(thread);
       
   327   // check whether zip archive contains name
       
   328   jint name_len;
       
   329   jzentry* entry = (*FindEntry)(_zip, name, filesize, &name_len);
       
   330   if (entry == NULL) return NULL;
       
   331   u1* buffer;
       
   332   char name_buf[128];
       
   333   char* filename;
       
   334   if (name_len < 128) {
       
   335     filename = name_buf;
       
   336   } else {
       
   337     filename = NEW_RESOURCE_ARRAY(char, name_len + 1);
       
   338   }
       
   339 
       
   340   // read contents into resource array
       
   341   int size = (*filesize) + ((nul_terminate) ? 1 : 0);
       
   342   buffer = NEW_RESOURCE_ARRAY(u1, size);
       
   343   if (!(*ReadEntry)(_zip, entry, buffer, filename)) return NULL;
       
   344 
       
   345   // return result
       
   346   if (nul_terminate) {
       
   347     buffer[*filesize] = 0;
       
   348   }
       
   349   return buffer;
       
   350 }
       
   351 
       
   352 #if INCLUDE_CDS
       
   353 u1* ClassPathZipEntry::open_versioned_entry(const char* name, jint* filesize, TRAPS) {
       
   354   u1* buffer = NULL;
       
   355   if (DumpSharedSpaces && !_is_boot_append) {
       
   356     // We presume default is multi-release enabled
       
   357     const char* multi_ver = Arguments::get_property("jdk.util.jar.enableMultiRelease");
       
   358     const char* verstr = Arguments::get_property("jdk.util.jar.version");
       
   359     bool is_multi_ver = (multi_ver == NULL ||
       
   360                          strcmp(multi_ver, "true") == 0 ||
       
   361                          strcmp(multi_ver, "force")  == 0) &&
       
   362                          is_multiple_versioned(THREAD);
       
   363     // command line version setting
       
   364     int version = 0;
       
   365     const int base_version = 8; // JDK8
       
   366     int cur_ver = JDK_Version::current().major_version();
       
   367     if (verstr != NULL) {
       
   368       version = atoi(verstr);
       
   369       if (version < base_version || version > cur_ver) {
       
   370         // If the specified version is lower than the base version, the base
       
   371         // entry will be used; if the version is higher than the current
       
   372         // jdk version, the highest versioned entry will be used.
       
   373         if (version < base_version) {
       
   374           is_multi_ver = false;
       
   375         }
       
   376         // print out warning, do not use assertion here since it will continue to look
       
   377         // for proper version.
       
   378         warning("JDK%d is not supported in multiple version jars", version);
       
   379       }
       
   380     }
       
   381 
       
   382     if (is_multi_ver) {
       
   383       int n;
       
   384       char* entry_name = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, JVM_MAXPATHLEN);
       
   385       if (version > 0) {
       
   386         n = jio_snprintf(entry_name, JVM_MAXPATHLEN, "META-INF/versions/%d/%s", version, name);
       
   387         entry_name[n] = '\0';
       
   388         buffer = open_entry((const char*)entry_name, filesize, false, CHECK_NULL);
       
   389         if (buffer == NULL) {
       
   390           warning("Could not find %s in %s, try to find highest version instead", entry_name, _zip_name);
       
   391         }
       
   392       }
       
   393       if (buffer == NULL) {
       
   394         for (int i = cur_ver; i >= base_version; i--) {
       
   395           n = jio_snprintf(entry_name, JVM_MAXPATHLEN, "META-INF/versions/%d/%s", i, name);
       
   396           entry_name[n] = '\0';
       
   397           buffer = open_entry((const char*)entry_name, filesize, false, CHECK_NULL);
       
   398           if (buffer != NULL) {
       
   399             break;
       
   400           }
       
   401         }
       
   402       }
       
   403       FREE_RESOURCE_ARRAY(char, entry_name, JVM_MAXPATHLEN);
       
   404     }
       
   405   }
       
   406   return buffer;
       
   407 }
       
   408 
       
   409 bool ClassPathZipEntry::is_multiple_versioned(TRAPS) {
       
   410   assert(DumpSharedSpaces, "called only at dump time");
       
   411   if (_multi_versioned != _unknown) {
       
   412     return (_multi_versioned == _yes) ? true : false;
       
   413   }
       
   414   jint size;
       
   415   char* buffer = (char*)open_entry("META-INF/MANIFEST.MF", &size, true, CHECK_false);
       
   416   if (buffer != NULL) {
       
   417     char* p = buffer;
       
   418     for ( ; *p; ++p) *p = tolower(*p);
       
   419     if (strstr(buffer, "multi-release: true") != NULL) {
       
   420       _multi_versioned = _yes;
       
   421       return true;
       
   422     }
       
   423   }
       
   424   _multi_versioned = _no;
       
   425   return false;
       
   426 }
       
   427 #endif // INCLUDE_CDS
       
   428 
       
   429 ClassFileStream* ClassPathZipEntry::open_stream(const char* name, TRAPS) {
       
   430   jint filesize;
       
   431   u1* buffer = open_versioned_entry(name, &filesize, CHECK_NULL);
       
   432   if (buffer == NULL) {
       
   433     buffer = open_entry(name, &filesize, false, CHECK_NULL);
       
   434     if (buffer == NULL) {
       
   435       return NULL;
       
   436     }
       
   437   }
       
   438   if (UsePerfData) {
       
   439     ClassLoader::perf_sys_classfile_bytes_read()->inc(filesize);
       
   440   }
       
   441   // Resource allocated
       
   442   return new ClassFileStream(buffer,
       
   443                              filesize,
       
   444                              _zip_name,
       
   445                              ClassFileStream::verify);
       
   446 }
       
   447 
       
   448 // invoke function for each entry in the zip file
       
   449 void ClassPathZipEntry::contents_do(void f(const char* name, void* context), void* context) {
       
   450   JavaThread* thread = JavaThread::current();
       
   451   HandleMark  handle_mark(thread);
       
   452   ThreadToNativeFromVM ttn(thread);
       
   453   for (int n = 0; ; n++) {
       
   454     jzentry * ze = ((*GetNextEntry)(_zip, n));
       
   455     if (ze == NULL) break;
       
   456     (*f)(ze->name, context);
       
   457   }
       
   458 }
       
   459 
       
   460 ClassPathImageEntry::ClassPathImageEntry(JImageFile* jimage, const char* name) :
       
   461   ClassPathEntry(),
       
   462   _jimage(jimage) {
       
   463   guarantee(jimage != NULL, "jimage file is null");
       
   464   guarantee(name != NULL, "jimage file name is null");
       
   465   size_t len = strlen(name) + 1;
       
   466   _name = NEW_C_HEAP_ARRAY(const char, len, mtClass);
       
   467   strncpy((char *)_name, name, len);
       
   468 }
       
   469 
       
   470 ClassPathImageEntry::~ClassPathImageEntry() {
       
   471   if (_name != NULL) {
       
   472     FREE_C_HEAP_ARRAY(const char, _name);
       
   473     _name = NULL;
       
   474   }
       
   475   if (_jimage != NULL) {
       
   476     (*JImageClose)(_jimage);
       
   477     _jimage = NULL;
       
   478   }
       
   479 }
       
   480 
       
   481 // For a class in a named module, look it up in the jimage file using this syntax:
       
   482 //    /<module-name>/<package-name>/<base-class>
       
   483 //
       
   484 // Assumptions:
       
   485 //     1. There are no unnamed modules in the jimage file.
       
   486 //     2. A package is in at most one module in the jimage file.
       
   487 //
       
   488 ClassFileStream* ClassPathImageEntry::open_stream(const char* name, TRAPS) {
       
   489   jlong size;
       
   490   JImageLocationRef location = (*JImageFindResource)(_jimage, "", get_jimage_version_string(), name, &size);
       
   491 
       
   492   if (location == 0) {
       
   493     ResourceMark rm;
       
   494     const char* pkg_name = ClassLoader::package_from_name(name);
       
   495 
       
   496     if (pkg_name != NULL) {
       
   497       if (!Universe::is_module_initialized()) {
       
   498         location = (*JImageFindResource)(_jimage, JAVA_BASE_NAME, get_jimage_version_string(), name, &size);
       
   499 #if INCLUDE_CDS
       
   500         // CDS uses the boot class loader to load classes whose packages are in
       
   501         // modules defined for other class loaders.  So, for now, get their module
       
   502         // names from the "modules" jimage file.
       
   503         if (DumpSharedSpaces && location == 0) {
       
   504           const char* module_name = (*JImagePackageToModule)(_jimage, pkg_name);
       
   505           if (module_name != NULL) {
       
   506             location = (*JImageFindResource)(_jimage, module_name, get_jimage_version_string(), name, &size);
       
   507           }
       
   508         }
       
   509 #endif
       
   510 
       
   511       } else {
       
   512         PackageEntry* package_entry = ClassLoader::get_package_entry(name, ClassLoaderData::the_null_class_loader_data(), CHECK_NULL);
       
   513         if (package_entry != NULL) {
       
   514           ResourceMark rm;
       
   515           // Get the module name
       
   516           ModuleEntry* module = package_entry->module();
       
   517           assert(module != NULL, "Boot classLoader package missing module");
       
   518           assert(module->is_named(), "Boot classLoader package is in unnamed module");
       
   519           const char* module_name = module->name()->as_C_string();
       
   520           if (module_name != NULL) {
       
   521             location = (*JImageFindResource)(_jimage, module_name, get_jimage_version_string(), name, &size);
       
   522           }
       
   523         }
       
   524       }
       
   525     }
       
   526   }
       
   527   if (location != 0) {
       
   528     if (UsePerfData) {
       
   529       ClassLoader::perf_sys_classfile_bytes_read()->inc(size);
       
   530     }
       
   531     char* data = NEW_RESOURCE_ARRAY(char, size);
       
   532     (*JImageGetResource)(_jimage, location, data, size);
       
   533     // Resource allocated
       
   534     return new ClassFileStream((u1*)data,
       
   535                                (int)size,
       
   536                                _name,
       
   537                                ClassFileStream::verify);
       
   538   }
       
   539 
       
   540   return NULL;
       
   541 }
       
   542 
       
   543 JImageLocationRef ClassLoader::jimage_find_resource(JImageFile* jf,
       
   544                                                     const char* module_name,
       
   545                                                     const char* file_name,
       
   546                                                     jlong &size) {
       
   547   return ((*JImageFindResource)(jf, module_name, get_jimage_version_string(), file_name, &size));
       
   548 }
       
   549 
       
   550 #ifndef PRODUCT
       
   551 bool ctw_visitor(JImageFile* jimage,
       
   552         const char* module_name, const char* version, const char* package,
       
   553         const char* name, const char* extension, void* arg) {
       
   554   if (strcmp(extension, "class") == 0) {
       
   555     Thread* THREAD = Thread::current();
       
   556     ResourceMark rm(THREAD);
       
   557     char* path = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, JIMAGE_MAX_PATH);
       
   558     jio_snprintf(path, JIMAGE_MAX_PATH - 1, "%s/%s.class", package, name);
       
   559     ClassLoader::compile_the_world_in(path, *(Handle*)arg, THREAD);
       
   560     return !HAS_PENDING_EXCEPTION;
       
   561   }
       
   562   return true;
       
   563 }
       
   564 
       
   565 void ClassPathImageEntry::compile_the_world(Handle loader, TRAPS) {
       
   566   tty->print_cr("CompileTheWorld : Compiling all classes in %s", name());
       
   567   tty->cr();
       
   568   (*JImageResourceIterator)(_jimage, (JImageResourceVisitor_t)ctw_visitor, (void *)&loader);
       
   569   if (HAS_PENDING_EXCEPTION) {
       
   570     if (PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())) {
       
   571       CLEAR_PENDING_EXCEPTION;
       
   572       tty->print_cr("\nCompileTheWorld : Ran out of memory\n");
       
   573       tty->print_cr("Increase class metadata storage if a limit was set");
       
   574     } else {
       
   575       tty->print_cr("\nCompileTheWorld : Unexpected exception occurred\n");
       
   576     }
       
   577   }
       
   578 }
       
   579 #endif
       
   580 
       
   581 bool ClassPathImageEntry::is_jrt() {
       
   582   return ClassLoader::is_jrt(name());
       
   583 }
       
   584 
       
   585 #if INCLUDE_CDS
       
   586 void ClassLoader::exit_with_path_failure(const char* error, const char* message) {
       
   587   assert(DumpSharedSpaces, "only called at dump time");
       
   588   tty->print_cr("Hint: enable -Xlog:class+path=info to diagnose the failure");
       
   589   vm_exit_during_initialization(error, message);
       
   590 }
       
   591 #endif
       
   592 
       
   593 ModuleClassPathList::ModuleClassPathList(Symbol* module_name) {
       
   594   _module_name = module_name;
       
   595   _module_first_entry = NULL;
       
   596   _module_last_entry = NULL;
       
   597 }
       
   598 
       
   599 ModuleClassPathList::~ModuleClassPathList() {
       
   600   // Clean out each ClassPathEntry on list
       
   601   ClassPathEntry* e = _module_first_entry;
       
   602   while (e != NULL) {
       
   603     ClassPathEntry* next_entry = e->next();
       
   604     delete e;
       
   605     e = next_entry;
       
   606   }
       
   607 }
       
   608 
       
   609 void ModuleClassPathList::add_to_list(ClassPathEntry* new_entry) {
       
   610   if (new_entry != NULL) {
       
   611     if (_module_last_entry == NULL) {
       
   612       _module_first_entry = _module_last_entry = new_entry;
       
   613     } else {
       
   614       _module_last_entry->set_next(new_entry);
       
   615       _module_last_entry = new_entry;
       
   616     }
       
   617   }
       
   618 }
       
   619 
       
   620 void ClassLoader::trace_class_path(const char* msg, const char* name) {
       
   621   LogTarget(Info, class, path) lt;
       
   622   if (lt.is_enabled()) {
       
   623     LogStream ls(lt);
       
   624     if (msg) {
       
   625       ls.print("%s", msg);
       
   626     }
       
   627     if (name) {
       
   628       if (strlen(name) < 256) {
       
   629         ls.print("%s", name);
       
   630       } else {
       
   631         // For very long paths, we need to print each character separately,
       
   632         // as print_cr() has a length limit
       
   633         while (name[0] != '\0') {
       
   634           ls.print("%c", name[0]);
       
   635           name++;
       
   636         }
       
   637       }
       
   638     }
       
   639     ls.cr();
       
   640   }
       
   641 }
       
   642 
       
   643 #if INCLUDE_CDS
       
   644 void ClassLoader::check_shared_classpath(const char *path) {
       
   645   if (strcmp(path, "") == 0) {
       
   646     exit_with_path_failure("Cannot have empty path in archived classpaths", NULL);
       
   647   }
       
   648 
       
   649   struct stat st;
       
   650   if (os::stat(path, &st) == 0) {
       
   651     if ((st.st_mode & S_IFMT) != S_IFREG) { // is not a regular file
       
   652       if (!os::dir_is_empty(path)) {
       
   653         tty->print_cr("Error: non-empty directory '%s'", path);
       
   654         exit_with_path_failure("CDS allows only empty directories in archived classpaths", NULL);
       
   655       }
       
   656     }
       
   657   }
       
   658 }
       
   659 #endif
       
   660 
       
   661 void ClassLoader::setup_bootstrap_search_path() {
       
   662   const char* sys_class_path = Arguments::get_sysclasspath();
       
   663   const char* java_class_path = Arguments::get_appclasspath();
       
   664   if (PrintSharedArchiveAndExit) {
       
   665     // Don't print sys_class_path - this is the bootcp of this current VM process, not necessarily
       
   666     // the same as the bootcp of the shared archive.
       
   667   } else {
       
   668     trace_class_path("bootstrap loader class path=", sys_class_path);
       
   669     trace_class_path("classpath: ", java_class_path);
       
   670   }
       
   671 #if INCLUDE_CDS
       
   672   if (DumpSharedSpaces) {
       
   673     _shared_paths_misc_info->add_boot_classpath(sys_class_path);
       
   674   }
       
   675 #endif
       
   676   setup_search_path(sys_class_path, true);
       
   677 }
       
   678 
       
   679 #if INCLUDE_CDS
       
   680 int ClassLoader::get_shared_paths_misc_info_size() {
       
   681   return _shared_paths_misc_info->get_used_bytes();
       
   682 }
       
   683 
       
   684 void* ClassLoader::get_shared_paths_misc_info() {
       
   685   return _shared_paths_misc_info->buffer();
       
   686 }
       
   687 
       
   688 bool ClassLoader::check_shared_paths_misc_info(void *buf, int size) {
       
   689   SharedPathsMiscInfo* checker = SharedClassUtil::allocate_shared_paths_misc_info((char*)buf, size);
       
   690   bool result = checker->check();
       
   691   delete checker;
       
   692   return result;
       
   693 }
       
   694 #endif
       
   695 
       
   696 // Construct the array of module/path pairs as specified to --patch-module
       
   697 // for the boot loader to search ahead of the jimage, if the class being
       
   698 // loaded is defined to a module that has been specified to --patch-module.
       
   699 void ClassLoader::setup_patch_mod_entries() {
       
   700   Thread* THREAD = Thread::current();
       
   701   GrowableArray<ModulePatchPath*>* patch_mod_args = Arguments::get_patch_mod_prefix();
       
   702   int num_of_entries = patch_mod_args->length();
       
   703 
       
   704 
       
   705   // Set up the boot loader's _patch_mod_entries list
       
   706   _patch_mod_entries = new (ResourceObj::C_HEAP, mtModule) GrowableArray<ModuleClassPathList*>(num_of_entries, true);
       
   707 
       
   708   for (int i = 0; i < num_of_entries; i++) {
       
   709     const char* module_name = (patch_mod_args->at(i))->module_name();
       
   710     Symbol* const module_sym = SymbolTable::lookup(module_name, (int)strlen(module_name), CHECK);
       
   711     assert(module_sym != NULL, "Failed to obtain Symbol for module name");
       
   712     ModuleClassPathList* module_cpl = new ModuleClassPathList(module_sym);
       
   713 
       
   714     char* class_path = (patch_mod_args->at(i))->path_string();
       
   715     int len = (int)strlen(class_path);
       
   716     int end = 0;
       
   717     // Iterate over the module's class path entries
       
   718     for (int start = 0; start < len; start = end) {
       
   719       while (class_path[end] && class_path[end] != os::path_separator()[0]) {
       
   720         end++;
       
   721       }
       
   722       EXCEPTION_MARK;
       
   723       ResourceMark rm(THREAD);
       
   724       char* path = NEW_RESOURCE_ARRAY(char, end - start + 1);
       
   725       strncpy(path, &class_path[start], end - start);
       
   726       path[end - start] = '\0';
       
   727 
       
   728       struct stat st;
       
   729       if (os::stat(path, &st) == 0) {
       
   730         // File or directory found
       
   731         Thread* THREAD = Thread::current();
       
   732         ClassPathEntry* new_entry = create_class_path_entry(path, &st, false, false, CHECK);
       
   733         // If the path specification is valid, enter it into this module's list
       
   734         if (new_entry != NULL) {
       
   735           module_cpl->add_to_list(new_entry);
       
   736         }
       
   737       }
       
   738 
       
   739       while (class_path[end] == os::path_separator()[0]) {
       
   740         end++;
       
   741       }
       
   742     }
       
   743 
       
   744     // Record the module into the list of --patch-module entries only if
       
   745     // valid ClassPathEntrys have been created
       
   746     if (module_cpl->module_first_entry() != NULL) {
       
   747       _patch_mod_entries->push(module_cpl);
       
   748     }
       
   749   }
       
   750 }
       
   751 
       
   752 // Determine whether the module has been patched via the command-line
       
   753 // option --patch-module
       
   754 bool ClassLoader::is_in_patch_mod_entries(Symbol* module_name) {
       
   755   if (_patch_mod_entries != NULL && _patch_mod_entries->is_nonempty()) {
       
   756     int table_len = _patch_mod_entries->length();
       
   757     for (int i = 0; i < table_len; i++) {
       
   758       ModuleClassPathList* patch_mod = _patch_mod_entries->at(i);
       
   759       if (module_name->fast_compare(patch_mod->module_name()) == 0) {
       
   760         return true;
       
   761       }
       
   762     }
       
   763   }
       
   764   return false;
       
   765 }
       
   766 
       
   767 void ClassLoader::setup_search_path(const char *class_path, bool bootstrap_search) {
       
   768   int len = (int)strlen(class_path);
       
   769   int end = 0;
       
   770   bool set_base_piece = bootstrap_search;
       
   771 
       
   772   // Iterate over class path entries
       
   773   for (int start = 0; start < len; start = end) {
       
   774     while (class_path[end] && class_path[end] != os::path_separator()[0]) {
       
   775       end++;
       
   776     }
       
   777     EXCEPTION_MARK;
       
   778     ResourceMark rm(THREAD);
       
   779     char* path = NEW_RESOURCE_ARRAY(char, end - start + 1);
       
   780     strncpy(path, &class_path[start], end - start);
       
   781     path[end - start] = '\0';
       
   782 
       
   783     // The first time through the bootstrap_search setup, it must be determined
       
   784     // what the base or core piece of the boot loader search is.  Either a java runtime
       
   785     // image is present or this is an exploded module build situation.
       
   786     if (set_base_piece) {
       
   787       assert(string_ends_with(path, MODULES_IMAGE_NAME) || string_ends_with(path, JAVA_BASE_NAME),
       
   788              "Incorrect boot loader search path, no java runtime image or " JAVA_BASE_NAME " exploded build");
       
   789       struct stat st;
       
   790       if (os::stat(path, &st) == 0) {
       
   791         // Directory found
       
   792         Thread* THREAD = Thread::current();
       
   793         ClassPathEntry* new_entry = create_class_path_entry(path, &st, false, false, CHECK);
       
   794 
       
   795         // Check for a jimage
       
   796         if (Arguments::has_jimage()) {
       
   797           assert(_jrt_entry == NULL, "should not setup bootstrap class search path twice");
       
   798           assert(new_entry != NULL && new_entry->is_jrt(), "No java runtime image present");
       
   799           _jrt_entry = new_entry;
       
   800           ++_num_entries;
       
   801 #if INCLUDE_CDS
       
   802           if (DumpSharedSpaces) {
       
   803             JImageFile *jimage = _jrt_entry->jimage();
       
   804             assert(jimage != NULL, "No java runtime image file present");
       
   805             ClassLoader::initialize_module_loader_map(jimage);
       
   806           }
       
   807 #endif
       
   808         }
       
   809       } else {
       
   810         // If path does not exist, exit
       
   811         vm_exit_during_initialization("Unable to establish the boot loader search path", path);
       
   812       }
       
   813       set_base_piece = false;
       
   814     } else {
       
   815       // Every entry on the system boot class path after the initial base piece,
       
   816       // which is set by os::set_boot_path(), is considered an appended entry.
       
   817       update_class_path_entry_list(path, false, bootstrap_search);
       
   818     }
       
   819 
       
   820 #if INCLUDE_CDS
       
   821     if (DumpSharedSpaces) {
       
   822       check_shared_classpath(path);
       
   823     }
       
   824 #endif
       
   825     while (class_path[end] == os::path_separator()[0]) {
       
   826       end++;
       
   827     }
       
   828   }
       
   829 }
       
   830 
       
   831 // During an exploded modules build, each module defined to the boot loader
       
   832 // will be added to the ClassLoader::_exploded_entries array.
       
   833 void ClassLoader::add_to_exploded_build_list(Symbol* module_sym, TRAPS) {
       
   834   assert(!ClassLoader::has_jrt_entry(), "Exploded build not applicable");
       
   835   assert(_exploded_entries != NULL, "_exploded_entries was not initialized");
       
   836 
       
   837   // Find the module's symbol
       
   838   ResourceMark rm(THREAD);
       
   839   const char *module_name = module_sym->as_C_string();
       
   840   const char *home = Arguments::get_java_home();
       
   841   const char file_sep = os::file_separator()[0];
       
   842   // 10 represents the length of "modules" + 2 file separators + \0
       
   843   size_t len = strlen(home) + strlen(module_name) + 10;
       
   844   char *path = NEW_C_HEAP_ARRAY(char, len, mtModule);
       
   845   jio_snprintf(path, len, "%s%cmodules%c%s", home, file_sep, file_sep, module_name);
       
   846 
       
   847   struct stat st;
       
   848   if (os::stat(path, &st) == 0) {
       
   849     // Directory found
       
   850     ClassPathEntry* new_entry = create_class_path_entry(path, &st, false, false, CHECK);
       
   851 
       
   852     // If the path specification is valid, enter it into this module's list.
       
   853     // There is no need to check for duplicate modules in the exploded entry list,
       
   854     // since no two modules with the same name can be defined to the boot loader.
       
   855     // This is checked at module definition time in Modules::define_module.
       
   856     if (new_entry != NULL) {
       
   857       ModuleClassPathList* module_cpl = new ModuleClassPathList(module_sym);
       
   858       module_cpl->add_to_list(new_entry);
       
   859       {
       
   860         MutexLocker ml(Module_lock, THREAD);
       
   861         _exploded_entries->push(module_cpl);
       
   862       }
       
   863       log_info(class, load)("path: %s", path);
       
   864     }
       
   865   }
       
   866   FREE_C_HEAP_ARRAY(char, path);
       
   867 }
       
   868 
       
   869 ClassPathEntry* ClassLoader::create_class_path_entry(const char *path, const struct stat* st,
       
   870                                                      bool throw_exception,
       
   871                                                      bool is_boot_append, TRAPS) {
       
   872   JavaThread* thread = JavaThread::current();
       
   873   ClassPathEntry* new_entry = NULL;
       
   874   if ((st->st_mode & S_IFMT) == S_IFREG) {
       
   875     ResourceMark rm(thread);
       
   876     // Regular file, should be a zip or jimage file
       
   877     // Canonicalized filename
       
   878     char* canonical_path = NEW_RESOURCE_ARRAY_IN_THREAD(thread, char, JVM_MAXPATHLEN);
       
   879     if (!get_canonical_path(path, canonical_path, JVM_MAXPATHLEN)) {
       
   880       // This matches the classic VM
       
   881       if (throw_exception) {
       
   882         THROW_MSG_(vmSymbols::java_io_IOException(), "Bad pathname", NULL);
       
   883       } else {
       
   884         return NULL;
       
   885       }
       
   886     }
       
   887     jint error;
       
   888     JImageFile* jimage =(*JImageOpen)(canonical_path, &error);
       
   889     if (jimage != NULL) {
       
   890       new_entry = new ClassPathImageEntry(jimage, canonical_path);
       
   891     } else {
       
   892       char* error_msg = NULL;
       
   893       jzfile* zip;
       
   894       {
       
   895         // enable call to C land
       
   896         ThreadToNativeFromVM ttn(thread);
       
   897         HandleMark hm(thread);
       
   898         zip = (*ZipOpen)(canonical_path, &error_msg);
       
   899       }
       
   900       if (zip != NULL && error_msg == NULL) {
       
   901         new_entry = new ClassPathZipEntry(zip, path, is_boot_append);
       
   902       } else {
       
   903         char *msg;
       
   904         if (error_msg == NULL) {
       
   905           msg = NEW_RESOURCE_ARRAY_IN_THREAD(thread, char, strlen(path) + 128); ;
       
   906           jio_snprintf(msg, strlen(path) + 127, "error in opening JAR file %s", path);
       
   907         } else {
       
   908           int len = (int)(strlen(path) + strlen(error_msg) + 128);
       
   909           msg = NEW_RESOURCE_ARRAY_IN_THREAD(thread, char, len); ;
       
   910           jio_snprintf(msg, len - 1, "error in opening JAR file <%s> %s", error_msg, path);
       
   911         }
       
   912         // Don't complain about bad jar files added via -Xbootclasspath/a:.
       
   913         if (throw_exception && is_init_completed()) {
       
   914           THROW_MSG_(vmSymbols::java_lang_ClassNotFoundException(), msg, NULL);
       
   915         } else {
       
   916           return NULL;
       
   917         }
       
   918       }
       
   919     }
       
   920     log_info(class, path)("opened: %s", path);
       
   921     log_info(class, load)("opened: %s", path);
       
   922   } else {
       
   923     // Directory
       
   924     new_entry = new ClassPathDirEntry(path);
       
   925     log_info(class, load)("path: %s", path);
       
   926   }
       
   927   return new_entry;
       
   928 }
       
   929 
       
   930 
       
   931 // Create a class path zip entry for a given path (return NULL if not found
       
   932 // or zip/JAR file cannot be opened)
       
   933 ClassPathZipEntry* ClassLoader::create_class_path_zip_entry(const char *path, bool is_boot_append) {
       
   934   // check for a regular file
       
   935   struct stat st;
       
   936   if (os::stat(path, &st) == 0) {
       
   937     if ((st.st_mode & S_IFMT) == S_IFREG) {
       
   938       char canonical_path[JVM_MAXPATHLEN];
       
   939       if (get_canonical_path(path, canonical_path, JVM_MAXPATHLEN)) {
       
   940         char* error_msg = NULL;
       
   941         jzfile* zip;
       
   942         {
       
   943           // enable call to C land
       
   944           JavaThread* thread = JavaThread::current();
       
   945           ThreadToNativeFromVM ttn(thread);
       
   946           HandleMark hm(thread);
       
   947           zip = (*ZipOpen)(canonical_path, &error_msg);
       
   948         }
       
   949         if (zip != NULL && error_msg == NULL) {
       
   950           // create using canonical path
       
   951           return new ClassPathZipEntry(zip, canonical_path, is_boot_append);
       
   952         }
       
   953       }
       
   954     }
       
   955   }
       
   956   return NULL;
       
   957 }
       
   958 
       
   959 // returns true if entry already on class path
       
   960 bool ClassLoader::contains_append_entry(const char* name) {
       
   961   ClassPathEntry* e = _first_append_entry;
       
   962   while (e != NULL) {
       
   963     // assume zip entries have been canonicalized
       
   964     if (strcmp(name, e->name()) == 0) {
       
   965       return true;
       
   966     }
       
   967     e = e->next();
       
   968   }
       
   969   return false;
       
   970 }
       
   971 
       
   972 void ClassLoader::add_to_list(ClassPathEntry *new_entry) {
       
   973   if (new_entry != NULL) {
       
   974     if (_last_append_entry == NULL) {
       
   975       assert(_first_append_entry == NULL, "boot loader's append class path entry list not empty");
       
   976       _first_append_entry = _last_append_entry = new_entry;
       
   977     } else {
       
   978       _last_append_entry->set_next(new_entry);
       
   979       _last_append_entry = new_entry;
       
   980     }
       
   981   }
       
   982   _num_entries++;
       
   983 }
       
   984 
       
   985 void ClassLoader::add_to_list(const char *apath) {
       
   986   update_class_path_entry_list((char*)apath, false, false);
       
   987 }
       
   988 
       
   989 // Returns true IFF the file/dir exists and the entry was successfully created.
       
   990 bool ClassLoader::update_class_path_entry_list(const char *path,
       
   991                                                bool check_for_duplicates,
       
   992                                                bool is_boot_append,
       
   993                                                bool throw_exception) {
       
   994   struct stat st;
       
   995   if (os::stat(path, &st) == 0) {
       
   996     // File or directory found
       
   997     ClassPathEntry* new_entry = NULL;
       
   998     Thread* THREAD = Thread::current();
       
   999     new_entry = create_class_path_entry(path, &st, throw_exception, is_boot_append, CHECK_(false));
       
  1000     if (new_entry == NULL) {
       
  1001       return false;
       
  1002     }
       
  1003 
       
  1004     // Do not reorder the bootclasspath which would break get_system_package().
       
  1005     // Add new entry to linked list
       
  1006     if (!check_for_duplicates || !contains_append_entry(new_entry->name())) {
       
  1007       ClassLoaderExt::add_class_path_entry(path, check_for_duplicates, new_entry);
       
  1008     }
       
  1009     return true;
       
  1010   } else {
       
  1011 #if INCLUDE_CDS
       
  1012     if (DumpSharedSpaces) {
       
  1013       _shared_paths_misc_info->add_nonexist_path(path);
       
  1014     }
       
  1015 #endif
       
  1016     return false;
       
  1017   }
       
  1018 }
       
  1019 
       
  1020 static void print_module_entry_table(const GrowableArray<ModuleClassPathList*>* const module_list) {
       
  1021   ResourceMark rm;
       
  1022   int num_of_entries = module_list->length();
       
  1023   for (int i = 0; i < num_of_entries; i++) {
       
  1024     ClassPathEntry* e;
       
  1025     ModuleClassPathList* mpl = module_list->at(i);
       
  1026     tty->print("%s=", mpl->module_name()->as_C_string());
       
  1027     e = mpl->module_first_entry();
       
  1028     while (e != NULL) {
       
  1029       tty->print("%s", e->name());
       
  1030       e = e->next();
       
  1031       if (e != NULL) {
       
  1032         tty->print("%s", os::path_separator());
       
  1033       }
       
  1034     }
       
  1035     tty->print(" ;");
       
  1036   }
       
  1037 }
       
  1038 
       
  1039 void ClassLoader::print_bootclasspath() {
       
  1040   ClassPathEntry* e;
       
  1041   tty->print("[bootclasspath= ");
       
  1042 
       
  1043   // Print --patch-module module/path specifications first
       
  1044   if (_patch_mod_entries != NULL) {
       
  1045     print_module_entry_table(_patch_mod_entries);
       
  1046   }
       
  1047 
       
  1048   // [jimage | exploded modules build]
       
  1049   if (has_jrt_entry()) {
       
  1050     // Print the location of the java runtime image
       
  1051     tty->print("%s ;", _jrt_entry->name());
       
  1052   } else {
       
  1053     // Print exploded module build path specifications
       
  1054     if (_exploded_entries != NULL) {
       
  1055       print_module_entry_table(_exploded_entries);
       
  1056     }
       
  1057   }
       
  1058 
       
  1059   // appended entries
       
  1060   e = _first_append_entry;
       
  1061   while (e != NULL) {
       
  1062     tty->print("%s ;", e->name());
       
  1063     e = e->next();
       
  1064   }
       
  1065   tty->print_cr("]");
       
  1066 }
       
  1067 
       
  1068 void ClassLoader::load_zip_library() {
       
  1069   assert(ZipOpen == NULL, "should not load zip library twice");
       
  1070   // First make sure native library is loaded
       
  1071   os::native_java_library();
       
  1072   // Load zip library
       
  1073   char path[JVM_MAXPATHLEN];
       
  1074   char ebuf[1024];
       
  1075   void* handle = NULL;
       
  1076   if (os::dll_locate_lib(path, sizeof(path), Arguments::get_dll_dir(), "zip")) {
       
  1077     handle = os::dll_load(path, ebuf, sizeof ebuf);
       
  1078   }
       
  1079   if (handle == NULL) {
       
  1080     vm_exit_during_initialization("Unable to load ZIP library", path);
       
  1081   }
       
  1082   // Lookup zip entry points
       
  1083   ZipOpen      = CAST_TO_FN_PTR(ZipOpen_t, os::dll_lookup(handle, "ZIP_Open"));
       
  1084   ZipClose     = CAST_TO_FN_PTR(ZipClose_t, os::dll_lookup(handle, "ZIP_Close"));
       
  1085   FindEntry    = CAST_TO_FN_PTR(FindEntry_t, os::dll_lookup(handle, "ZIP_FindEntry"));
       
  1086   ReadEntry    = CAST_TO_FN_PTR(ReadEntry_t, os::dll_lookup(handle, "ZIP_ReadEntry"));
       
  1087   GetNextEntry = CAST_TO_FN_PTR(GetNextEntry_t, os::dll_lookup(handle, "ZIP_GetNextEntry"));
       
  1088   ZipInflateFully = CAST_TO_FN_PTR(ZipInflateFully_t, os::dll_lookup(handle, "ZIP_InflateFully"));
       
  1089   Crc32        = CAST_TO_FN_PTR(Crc32_t, os::dll_lookup(handle, "ZIP_CRC32"));
       
  1090 
       
  1091   // ZIP_Close is not exported on Windows in JDK5.0 so don't abort if ZIP_Close is NULL
       
  1092   if (ZipOpen == NULL || FindEntry == NULL || ReadEntry == NULL ||
       
  1093       GetNextEntry == NULL || Crc32 == NULL) {
       
  1094     vm_exit_during_initialization("Corrupted ZIP library", path);
       
  1095   }
       
  1096 
       
  1097   if (ZipInflateFully == NULL) {
       
  1098     vm_exit_during_initialization("Corrupted ZIP library ZIP_InflateFully missing", path);
       
  1099   }
       
  1100 
       
  1101   // Lookup canonicalize entry in libjava.dll
       
  1102   void *javalib_handle = os::native_java_library();
       
  1103   CanonicalizeEntry = CAST_TO_FN_PTR(canonicalize_fn_t, os::dll_lookup(javalib_handle, "Canonicalize"));
       
  1104   // This lookup only works on 1.3. Do not check for non-null here
       
  1105 }
       
  1106 
       
  1107 void ClassLoader::load_jimage_library() {
       
  1108   // First make sure native library is loaded
       
  1109   os::native_java_library();
       
  1110   // Load jimage library
       
  1111   char path[JVM_MAXPATHLEN];
       
  1112   char ebuf[1024];
       
  1113   void* handle = NULL;
       
  1114   if (os::dll_locate_lib(path, sizeof(path), Arguments::get_dll_dir(), "jimage")) {
       
  1115     handle = os::dll_load(path, ebuf, sizeof ebuf);
       
  1116   }
       
  1117   if (handle == NULL) {
       
  1118     vm_exit_during_initialization("Unable to load jimage library", path);
       
  1119   }
       
  1120 
       
  1121   // Lookup jimage entry points
       
  1122   JImageOpen = CAST_TO_FN_PTR(JImageOpen_t, os::dll_lookup(handle, "JIMAGE_Open"));
       
  1123   guarantee(JImageOpen != NULL, "function JIMAGE_Open not found");
       
  1124   JImageClose = CAST_TO_FN_PTR(JImageClose_t, os::dll_lookup(handle, "JIMAGE_Close"));
       
  1125   guarantee(JImageClose != NULL, "function JIMAGE_Close not found");
       
  1126   JImagePackageToModule = CAST_TO_FN_PTR(JImagePackageToModule_t, os::dll_lookup(handle, "JIMAGE_PackageToModule"));
       
  1127   guarantee(JImagePackageToModule != NULL, "function JIMAGE_PackageToModule not found");
       
  1128   JImageFindResource = CAST_TO_FN_PTR(JImageFindResource_t, os::dll_lookup(handle, "JIMAGE_FindResource"));
       
  1129   guarantee(JImageFindResource != NULL, "function JIMAGE_FindResource not found");
       
  1130   JImageGetResource = CAST_TO_FN_PTR(JImageGetResource_t, os::dll_lookup(handle, "JIMAGE_GetResource"));
       
  1131   guarantee(JImageGetResource != NULL, "function JIMAGE_GetResource not found");
       
  1132   JImageResourceIterator = CAST_TO_FN_PTR(JImageResourceIterator_t, os::dll_lookup(handle, "JIMAGE_ResourceIterator"));
       
  1133   guarantee(JImageResourceIterator != NULL, "function JIMAGE_ResourceIterator not found");
       
  1134   JImageResourcePath = CAST_TO_FN_PTR(JImage_ResourcePath_t, os::dll_lookup(handle, "JIMAGE_ResourcePath"));
       
  1135   guarantee(JImageResourcePath != NULL, "function JIMAGE_ResourcePath not found");
       
  1136 }
       
  1137 
       
  1138 jboolean ClassLoader::decompress(void *in, u8 inSize, void *out, u8 outSize, char **pmsg) {
       
  1139   return (*ZipInflateFully)(in, inSize, out, outSize, pmsg);
       
  1140 }
       
  1141 
       
  1142 int ClassLoader::crc32(int crc, const char* buf, int len) {
       
  1143   assert(Crc32 != NULL, "ZIP_CRC32 is not found");
       
  1144   return (*Crc32)(crc, (const jbyte*)buf, len);
       
  1145 }
       
  1146 
       
  1147 #if INCLUDE_CDS
       
  1148 void ClassLoader::initialize_module_loader_map(JImageFile* jimage) {
       
  1149   if (!DumpSharedSpaces) {
       
  1150     return; // only needed for CDS dump time
       
  1151   }
       
  1152 
       
  1153   ResourceMark rm;
       
  1154   jlong size;
       
  1155   JImageLocationRef location = (*JImageFindResource)(jimage, JAVA_BASE_NAME, get_jimage_version_string(), MODULE_LOADER_MAP, &size);
       
  1156   if (location == 0) {
       
  1157     vm_exit_during_initialization(
       
  1158       "Cannot find ModuleLoaderMap location from modules jimage.", NULL);
       
  1159   }
       
  1160   char* buffer = NEW_RESOURCE_ARRAY(char, size + 1);
       
  1161   buffer[size] = '\0';
       
  1162   jlong read = (*JImageGetResource)(jimage, location, buffer, size);
       
  1163   if (read != size) {
       
  1164     vm_exit_during_initialization(
       
  1165       "Cannot find ModuleLoaderMap resource from modules jimage.", NULL);
       
  1166   }
       
  1167   char* char_buf = (char*)buffer;
       
  1168   int buflen = (int)strlen(char_buf);
       
  1169   char* begin_ptr = char_buf;
       
  1170   char* end_ptr = strchr(begin_ptr, '\n');
       
  1171   bool process_boot_modules = false;
       
  1172   _boot_modules_array = new (ResourceObj::C_HEAP, mtModule)
       
  1173     GrowableArray<char*>(INITIAL_BOOT_MODULES_ARRAY_SIZE, true);
       
  1174   _platform_modules_array = new (ResourceObj::C_HEAP, mtModule)
       
  1175     GrowableArray<char*>(INITIAL_PLATFORM_MODULES_ARRAY_SIZE, true);
       
  1176   while (end_ptr != NULL && (end_ptr - char_buf) < buflen) {
       
  1177     // Allocate a buffer from the C heap to be appended to the _boot_modules_array
       
  1178     // or the _platform_modules_array.
       
  1179     char* temp_name = NEW_C_HEAP_ARRAY(char, (size_t)(end_ptr - begin_ptr + 1), mtInternal);
       
  1180     strncpy(temp_name, begin_ptr, end_ptr - begin_ptr);
       
  1181     temp_name[end_ptr - begin_ptr] = '\0';
       
  1182     if (strncmp(temp_name, "BOOT", 4) == 0) {
       
  1183       process_boot_modules = true;
       
  1184       FREE_C_HEAP_ARRAY(char, temp_name);
       
  1185     } else if (strncmp(temp_name, "PLATFORM", 8) == 0) {
       
  1186       process_boot_modules = false;
       
  1187       FREE_C_HEAP_ARRAY(char, temp_name);
       
  1188     } else {
       
  1189       // module name
       
  1190       if (process_boot_modules) {
       
  1191         _boot_modules_array->append(temp_name);
       
  1192       } else {
       
  1193         _platform_modules_array->append(temp_name);
       
  1194       }
       
  1195     }
       
  1196     begin_ptr = ++end_ptr;
       
  1197     end_ptr = strchr(begin_ptr, '\n');
       
  1198   }
       
  1199 }
       
  1200 #endif
       
  1201 
       
  1202 // Function add_package extracts the package from the fully qualified class name
       
  1203 // and checks if the package is in the boot loader's package entry table.  If so,
       
  1204 // then it sets the classpath_index in the package entry record.
       
  1205 //
       
  1206 // The classpath_index field is used to find the entry on the boot loader class
       
  1207 // path for packages with classes loaded by the boot loader from -Xbootclasspath/a
       
  1208 // in an unnamed module.  It is also used to indicate (for all packages whose
       
  1209 // classes are loaded by the boot loader) that at least one of the package's
       
  1210 // classes has been loaded.
       
  1211 bool ClassLoader::add_package(const char *fullq_class_name, s2 classpath_index, TRAPS) {
       
  1212   assert(fullq_class_name != NULL, "just checking");
       
  1213 
       
  1214   // Get package name from fully qualified class name.
       
  1215   ResourceMark rm;
       
  1216   const char *cp = package_from_name(fullq_class_name);
       
  1217   if (cp != NULL) {
       
  1218     PackageEntryTable* pkg_entry_tbl = ClassLoaderData::the_null_class_loader_data()->packages();
       
  1219     TempNewSymbol pkg_symbol = SymbolTable::new_symbol(cp, CHECK_false);
       
  1220     PackageEntry* pkg_entry = pkg_entry_tbl->lookup_only(pkg_symbol);
       
  1221     if (pkg_entry != NULL) {
       
  1222       assert(classpath_index != -1, "Unexpected classpath_index");
       
  1223       pkg_entry->set_classpath_index(classpath_index);
       
  1224     } else {
       
  1225       return false;
       
  1226     }
       
  1227   }
       
  1228   return true;
       
  1229 }
       
  1230 
       
  1231 oop ClassLoader::get_system_package(const char* name, TRAPS) {
       
  1232   // Look up the name in the boot loader's package entry table.
       
  1233   if (name != NULL) {
       
  1234     TempNewSymbol package_sym = SymbolTable::new_symbol(name, (int)strlen(name), CHECK_NULL);
       
  1235     // Look for the package entry in the boot loader's package entry table.
       
  1236     PackageEntry* package =
       
  1237       ClassLoaderData::the_null_class_loader_data()->packages()->lookup_only(package_sym);
       
  1238 
       
  1239     // Return NULL if package does not exist or if no classes in that package
       
  1240     // have been loaded.
       
  1241     if (package != NULL && package->has_loaded_class()) {
       
  1242       ModuleEntry* module = package->module();
       
  1243       if (module->location() != NULL) {
       
  1244         ResourceMark rm(THREAD);
       
  1245         Handle ml = java_lang_String::create_from_str(
       
  1246           module->location()->as_C_string(), THREAD);
       
  1247         return ml();
       
  1248       }
       
  1249       // Return entry on boot loader class path.
       
  1250       Handle cph = java_lang_String::create_from_str(
       
  1251         ClassLoader::classpath_entry(package->classpath_index())->name(), THREAD);
       
  1252       return cph();
       
  1253     }
       
  1254   }
       
  1255   return NULL;
       
  1256 }
       
  1257 
       
  1258 objArrayOop ClassLoader::get_system_packages(TRAPS) {
       
  1259   ResourceMark rm(THREAD);
       
  1260   // List of pointers to PackageEntrys that have loaded classes.
       
  1261   GrowableArray<PackageEntry*>* loaded_class_pkgs = new GrowableArray<PackageEntry*>(50);
       
  1262   {
       
  1263     MutexLocker ml(Module_lock, THREAD);
       
  1264 
       
  1265     PackageEntryTable* pe_table =
       
  1266       ClassLoaderData::the_null_class_loader_data()->packages();
       
  1267 
       
  1268     // Collect the packages that have at least one loaded class.
       
  1269     for (int x = 0; x < pe_table->table_size(); x++) {
       
  1270       for (PackageEntry* package_entry = pe_table->bucket(x);
       
  1271            package_entry != NULL;
       
  1272            package_entry = package_entry->next()) {
       
  1273         if (package_entry->has_loaded_class()) {
       
  1274           loaded_class_pkgs->append(package_entry);
       
  1275         }
       
  1276       }
       
  1277     }
       
  1278   }
       
  1279 
       
  1280 
       
  1281   // Allocate objArray and fill with java.lang.String
       
  1282   objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(),
       
  1283                                            loaded_class_pkgs->length(), CHECK_NULL);
       
  1284   objArrayHandle result(THREAD, r);
       
  1285   for (int x = 0; x < loaded_class_pkgs->length(); x++) {
       
  1286     PackageEntry* package_entry = loaded_class_pkgs->at(x);
       
  1287     Handle str = java_lang_String::create_from_symbol(package_entry->name(), CHECK_NULL);
       
  1288     result->obj_at_put(x, str());
       
  1289   }
       
  1290   return result();
       
  1291 }
       
  1292 
       
  1293 #if INCLUDE_CDS
       
  1294 s2 ClassLoader::module_to_classloader(const char* module_name) {
       
  1295 
       
  1296   assert(DumpSharedSpaces, "dump time only");
       
  1297   assert(_boot_modules_array != NULL, "_boot_modules_array is NULL");
       
  1298   assert(_platform_modules_array != NULL, "_platform_modules_array is NULL");
       
  1299 
       
  1300   int array_size = _boot_modules_array->length();
       
  1301   for (int i = 0; i < array_size; i++) {
       
  1302     if (strcmp(module_name, _boot_modules_array->at(i)) == 0) {
       
  1303       return BOOT_LOADER;
       
  1304     }
       
  1305   }
       
  1306 
       
  1307   array_size = _platform_modules_array->length();
       
  1308   for (int i = 0; i < array_size; i++) {
       
  1309     if (strcmp(module_name, _platform_modules_array->at(i)) == 0) {
       
  1310       return PLATFORM_LOADER;
       
  1311     }
       
  1312   }
       
  1313 
       
  1314   return APP_LOADER;
       
  1315 }
       
  1316 
       
  1317 s2 ClassLoader::classloader_type(Symbol* class_name, ClassPathEntry* e, int classpath_index, TRAPS) {
       
  1318   assert(DumpSharedSpaces, "Only used for CDS dump time");
       
  1319 
       
  1320   // obtain the classloader type based on the class name.
       
  1321   // First obtain the package name based on the class name. Then obtain
       
  1322   // the classloader type based on the package name from the jimage using
       
  1323   // a jimage API. If the classloader type cannot be found from the
       
  1324   // jimage, it is determined by the class path entry.
       
  1325   jshort loader_type = ClassLoader::APP_LOADER;
       
  1326   if (e->is_jrt()) {
       
  1327     ResourceMark rm;
       
  1328     TempNewSymbol pkg_name = InstanceKlass::package_from_name(class_name, CHECK_0);
       
  1329     if (pkg_name != NULL) {
       
  1330       const char* pkg_name_C_string = (const char*)(pkg_name->as_C_string());
       
  1331       ClassPathImageEntry* cpie = (ClassPathImageEntry*)e;
       
  1332       JImageFile* jimage = cpie->jimage();
       
  1333       char* module_name = (char*)(*JImagePackageToModule)(jimage, pkg_name_C_string);
       
  1334       if (module_name != NULL) {
       
  1335         loader_type = ClassLoader::module_to_classloader(module_name);
       
  1336       }
       
  1337     }
       
  1338   } else if (ClassLoaderExt::is_boot_classpath(classpath_index)) {
       
  1339     loader_type = ClassLoader::BOOT_LOADER;
       
  1340   }
       
  1341   return loader_type;
       
  1342 }
       
  1343 #endif
       
  1344 
       
  1345 // caller needs ResourceMark
       
  1346 const char* ClassLoader::file_name_for_class_name(const char* class_name,
       
  1347                                                   int class_name_len) {
       
  1348   assert(class_name != NULL, "invariant");
       
  1349   assert((int)strlen(class_name) == class_name_len, "invariant");
       
  1350 
       
  1351   static const char class_suffix[] = ".class";
       
  1352 
       
  1353   char* const file_name = NEW_RESOURCE_ARRAY(char,
       
  1354                                              class_name_len +
       
  1355                                              sizeof(class_suffix)); // includes term NULL
       
  1356 
       
  1357   strncpy(file_name, class_name, class_name_len);
       
  1358   strncpy(&file_name[class_name_len], class_suffix, sizeof(class_suffix));
       
  1359 
       
  1360   return file_name;
       
  1361 }
       
  1362 
       
  1363 ClassPathEntry* find_first_module_cpe(ModuleEntry* mod_entry,
       
  1364                                       const GrowableArray<ModuleClassPathList*>* const module_list) {
       
  1365   int num_of_entries = module_list->length();
       
  1366   const Symbol* class_module_name = mod_entry->name();
       
  1367 
       
  1368   // Loop through all the modules in either the patch-module or exploded entries looking for module
       
  1369   for (int i = 0; i < num_of_entries; i++) {
       
  1370     ModuleClassPathList* module_cpl = module_list->at(i);
       
  1371     Symbol* module_cpl_name = module_cpl->module_name();
       
  1372 
       
  1373     if (module_cpl_name->fast_compare(class_module_name) == 0) {
       
  1374       // Class' module has been located.
       
  1375       return module_cpl->module_first_entry();
       
  1376     }
       
  1377   }
       
  1378   return NULL;
       
  1379 }
       
  1380 
       
  1381 
       
  1382 // Search either the patch-module or exploded build entries for class.
       
  1383 ClassFileStream* ClassLoader::search_module_entries(const GrowableArray<ModuleClassPathList*>* const module_list,
       
  1384                                                     const char* const class_name,
       
  1385                                                     const char* const file_name,
       
  1386                                                     TRAPS) {
       
  1387   ClassFileStream* stream = NULL;
       
  1388 
       
  1389   // Find the class' defining module in the boot loader's module entry table
       
  1390   PackageEntry* pkg_entry = get_package_entry(class_name, ClassLoaderData::the_null_class_loader_data(), CHECK_NULL);
       
  1391   ModuleEntry* mod_entry = (pkg_entry != NULL) ? pkg_entry->module() : NULL;
       
  1392 
       
  1393   // If the module system has not defined java.base yet, then
       
  1394   // classes loaded are assumed to be defined to java.base.
       
  1395   // When java.base is eventually defined by the module system,
       
  1396   // all packages of classes that have been previously loaded
       
  1397   // are verified in ModuleEntryTable::verify_javabase_packages().
       
  1398   if (!Universe::is_module_initialized() &&
       
  1399       !ModuleEntryTable::javabase_defined() &&
       
  1400       mod_entry == NULL) {
       
  1401     mod_entry = ModuleEntryTable::javabase_moduleEntry();
       
  1402   }
       
  1403 
       
  1404   // The module must be a named module
       
  1405   ClassPathEntry* e = NULL;
       
  1406   if (mod_entry != NULL && mod_entry->is_named()) {
       
  1407     if (module_list == _exploded_entries) {
       
  1408       // The exploded build entries can be added to at any time so a lock is
       
  1409       // needed when searching them.
       
  1410       assert(!ClassLoader::has_jrt_entry(), "Must be exploded build");
       
  1411       MutexLocker ml(Module_lock, THREAD);
       
  1412       e = find_first_module_cpe(mod_entry, module_list);
       
  1413     } else {
       
  1414       e = find_first_module_cpe(mod_entry, module_list);
       
  1415     }
       
  1416   }
       
  1417 
       
  1418   // Try to load the class from the module's ClassPathEntry list.
       
  1419   while (e != NULL) {
       
  1420     stream = e->open_stream(file_name, CHECK_NULL);
       
  1421     // No context.check is required since CDS is not supported
       
  1422     // for an exploded modules build or if --patch-module is specified.
       
  1423     if (NULL != stream) {
       
  1424       return stream;
       
  1425     }
       
  1426     e = e->next();
       
  1427   }
       
  1428   // If the module was located, break out even if the class was not
       
  1429   // located successfully from that module's ClassPathEntry list.
       
  1430   // There will not be another valid entry for that module.
       
  1431   return NULL;
       
  1432 }
       
  1433 
       
  1434 InstanceKlass* ClassLoader::load_class(Symbol* name, bool search_append_only, TRAPS) {
       
  1435   assert(name != NULL, "invariant");
       
  1436   assert(THREAD->is_Java_thread(), "must be a JavaThread");
       
  1437 
       
  1438   ResourceMark rm(THREAD);
       
  1439   HandleMark hm(THREAD);
       
  1440 
       
  1441   const char* const class_name = name->as_C_string();
       
  1442 
       
  1443   EventMark m("loading class %s", class_name);
       
  1444 
       
  1445   const char* const file_name = file_name_for_class_name(class_name,
       
  1446                                                          name->utf8_length());
       
  1447   assert(file_name != NULL, "invariant");
       
  1448 
       
  1449   ClassLoaderExt::Context context(class_name, file_name, THREAD);
       
  1450 
       
  1451   // Lookup stream for parsing .class file
       
  1452   ClassFileStream* stream = NULL;
       
  1453   s2 classpath_index = 0;
       
  1454   ClassPathEntry* e = NULL;
       
  1455 
       
  1456   // If DumpSharedSpaces is true boot loader visibility boundaries are set to:
       
  1457   //   - [jimage] + [_first_append_entry to _last_append_entry] (all path entries).
       
  1458   //
       
  1459   // If search_append_only is true, boot loader visibility boundaries are
       
  1460   // set to be _first_append_entry to the end. This includes:
       
  1461   //   [-Xbootclasspath/a]; [jvmti appended entries]
       
  1462   //
       
  1463   // If both DumpSharedSpaces and search_append_only are false, boot loader
       
  1464   // visibility boundaries are set to be the --patch-module entries plus the base piece.
       
  1465   // This would include:
       
  1466   //   [--patch-module=<module>=<file>(<pathsep><file>)*]; [jimage | exploded module build]
       
  1467   //
       
  1468 
       
  1469   // Load Attempt #1: --patch-module
       
  1470   // Determine the class' defining module.  If it appears in the _patch_mod_entries,
       
  1471   // attempt to load the class from those locations specific to the module.
       
  1472   // Specifications to --patch-module can contain a partial number of classes
       
  1473   // that are part of the overall module definition.  So if a particular class is not
       
  1474   // found within its module specification, the search should continue to Load Attempt #2.
       
  1475   // Note: The --patch-module entries are never searched if the boot loader's
       
  1476   //       visibility boundary is limited to only searching the append entries.
       
  1477   if (_patch_mod_entries != NULL && !search_append_only) {
       
  1478     // At CDS dump time, the --patch-module entries are ignored. That means a
       
  1479     // class is still loaded from the runtime image even if it might
       
  1480     // appear in the _patch_mod_entries. The runtime shared class visibility
       
  1481     // check will determine if a shared class is visible based on the runtime
       
  1482     // environemnt, including the runtime --patch-module setting.
       
  1483     if (!DumpSharedSpaces) {
       
  1484       stream = search_module_entries(_patch_mod_entries, class_name, file_name, CHECK_NULL);
       
  1485     }
       
  1486   }
       
  1487 
       
  1488   // Load Attempt #2: [jimage | exploded build]
       
  1489   if (!search_append_only && (NULL == stream)) {
       
  1490     if (has_jrt_entry()) {
       
  1491       e = _jrt_entry;
       
  1492       stream = _jrt_entry->open_stream(file_name, CHECK_NULL);
       
  1493       if (!context.check(stream, classpath_index)) {
       
  1494         return NULL;
       
  1495       }
       
  1496     } else {
       
  1497       // Exploded build - attempt to locate class in its defining module's location.
       
  1498       assert(_exploded_entries != NULL, "No exploded build entries present");
       
  1499       stream = search_module_entries(_exploded_entries, class_name, file_name, CHECK_NULL);
       
  1500     }
       
  1501   }
       
  1502 
       
  1503   // Load Attempt #3: [-Xbootclasspath/a]; [jvmti appended entries]
       
  1504   if ((search_append_only || DumpSharedSpaces) && (NULL == stream)) {
       
  1505     // For the boot loader append path search, the starting classpath_index
       
  1506     // for the appended piece is always 1 to account for either the
       
  1507     // _jrt_entry or the _exploded_entries.
       
  1508     assert(classpath_index == 0, "The classpath_index has been incremented incorrectly");
       
  1509     classpath_index = 1;
       
  1510 
       
  1511     e = _first_append_entry;
       
  1512     while (e != NULL) {
       
  1513       if (DumpSharedSpaces && classpath_index >= _num_boot_entries) {
       
  1514         // Do not load any class from the app classpath using the boot loader. Let
       
  1515         // the built-in app class laoder load them.
       
  1516         break;
       
  1517       }
       
  1518       stream = e->open_stream(file_name, CHECK_NULL);
       
  1519       if (!context.check(stream, classpath_index)) {
       
  1520         return NULL;
       
  1521       }
       
  1522       if (NULL != stream) {
       
  1523         break;
       
  1524       }
       
  1525       e = e->next();
       
  1526       ++classpath_index;
       
  1527     }
       
  1528   }
       
  1529 
       
  1530   if (NULL == stream) {
       
  1531     return NULL;
       
  1532   }
       
  1533 
       
  1534   stream->set_verify(context.should_verify(classpath_index));
       
  1535 
       
  1536   ClassLoaderData* loader_data = ClassLoaderData::the_null_class_loader_data();
       
  1537   Handle protection_domain;
       
  1538 
       
  1539   InstanceKlass* result = KlassFactory::create_from_stream(stream,
       
  1540                                                            name,
       
  1541                                                            loader_data,
       
  1542                                                            protection_domain,
       
  1543                                                            NULL, // host_klass
       
  1544                                                            NULL, // cp_patches
       
  1545                                                            THREAD);
       
  1546   if (HAS_PENDING_EXCEPTION) {
       
  1547     if (DumpSharedSpaces) {
       
  1548       tty->print_cr("Preload Error: Failed to load %s", class_name);
       
  1549     }
       
  1550     return NULL;
       
  1551   }
       
  1552 
       
  1553   return context.record_result(name, e, classpath_index, result, THREAD);
       
  1554 }
       
  1555 
       
  1556 #if INCLUDE_CDS
       
  1557 static char* skip_uri_protocol(char* source) {
       
  1558   if (strncmp(source, "file:", 5) == 0) {
       
  1559     // file: protocol path could start with file:/ or file:///
       
  1560     // locate the char after all the forward slashes
       
  1561     int offset = 5;
       
  1562     while (*(source + offset) == '/') {
       
  1563         offset++;
       
  1564     }
       
  1565     source += offset;
       
  1566   // for non-windows platforms, move back one char as the path begins with a '/'
       
  1567 #ifndef _WINDOWS
       
  1568     source -= 1;
       
  1569 #endif
       
  1570   } else if (strncmp(source, "jrt:/", 5) == 0) {
       
  1571     source += 5;
       
  1572   }
       
  1573   return source;
       
  1574 }
       
  1575 
       
  1576 void ClassLoader::record_shared_class_loader_type(InstanceKlass* ik, const ClassFileStream* stream) {
       
  1577   assert(DumpSharedSpaces, "sanity");
       
  1578   assert(stream != NULL, "sanity");
       
  1579 
       
  1580   if (ik->is_anonymous()) {
       
  1581     // We do not archive anonymous classes.
       
  1582     return;
       
  1583   }
       
  1584 
       
  1585   if (stream->source() == NULL) {
       
  1586     if (ik->class_loader() == NULL) {
       
  1587       // JFR classes
       
  1588       ik->set_shared_classpath_index(0);
       
  1589       ik->set_class_loader_type(ClassLoader::BOOT_LOADER);
       
  1590     }
       
  1591     return;
       
  1592   }
       
  1593 
       
  1594   assert(has_jrt_entry(), "CDS dumping does not support exploded JDK build");
       
  1595 
       
  1596   ModuleEntry* module = ik->module();
       
  1597   ClassPathEntry* e = NULL;
       
  1598   int classpath_index = 0;
       
  1599 
       
  1600   // Check if the class is from the runtime image
       
  1601   if (module != NULL && (module->location() != NULL) &&
       
  1602       (module->location()->starts_with("jrt:"))) {
       
  1603     e = _jrt_entry;
       
  1604     classpath_index = 0;
       
  1605   } else {
       
  1606     classpath_index = 1;
       
  1607     ResourceMark rm;
       
  1608     char* canonical_path = NEW_RESOURCE_ARRAY(char, JVM_MAXPATHLEN);
       
  1609     for (e = _first_append_entry; e != NULL; e = e->next()) {
       
  1610       if (get_canonical_path(e->name(), canonical_path, JVM_MAXPATHLEN)) {
       
  1611         char* src = (char*)stream->source();
       
  1612         // save the path from the file: protocol or the module name from the jrt: protocol
       
  1613         // if no protocol prefix is found, src is the same as stream->source() after the following call
       
  1614         src = skip_uri_protocol(src);
       
  1615         if (strcmp(canonical_path, os::native_path((char*)src)) == 0) {
       
  1616           break;
       
  1617         }
       
  1618         classpath_index ++;
       
  1619       }
       
  1620     }
       
  1621     if (e == NULL) {
       
  1622       assert(ik->shared_classpath_index() < 0,
       
  1623         "must be a class from a custom jar which isn't in the class path or boot class path");
       
  1624       return;
       
  1625     }
       
  1626   }
       
  1627 
       
  1628   if (classpath_index < _num_boot_entries) {
       
  1629     // ik is either:
       
  1630     // 1) a boot class loaded from the runtime image during vm initialization (classpath_index = 0); or
       
  1631     // 2) a user's class from -Xbootclasspath/a (classpath_index > 0)
       
  1632     // In the second case, the classpath_index, classloader_type will be recorded via
       
  1633     // context.record_result() in ClassLoader::load_class(Symbol* name, bool search_append_only, TRAPS).
       
  1634     if (classpath_index > 0) {
       
  1635       return;
       
  1636     }
       
  1637   }
       
  1638 
       
  1639   ResourceMark rm;
       
  1640   const char* const class_name = ik->name()->as_C_string();
       
  1641   const char* const file_name = file_name_for_class_name(class_name,
       
  1642                                                          ik->name()->utf8_length());
       
  1643   assert(file_name != NULL, "invariant");
       
  1644   Thread* THREAD = Thread::current();
       
  1645   ClassLoaderExt::Context context(class_name, file_name, CATCH);
       
  1646   context.record_result(ik->name(), e, classpath_index, ik, THREAD);
       
  1647 }
       
  1648 #endif // INCLUDE_CDS
       
  1649 
       
  1650 // Initialize the class loader's access to methods in libzip.  Parse and
       
  1651 // process the boot classpath into a list ClassPathEntry objects.  Once
       
  1652 // this list has been created, it must not change order (see class PackageInfo)
       
  1653 // it can be appended to and is by jvmti and the kernel vm.
       
  1654 
       
  1655 void ClassLoader::initialize() {
       
  1656   EXCEPTION_MARK;
       
  1657 
       
  1658   if (UsePerfData) {
       
  1659     // jvmstat performance counters
       
  1660     NEWPERFTICKCOUNTER(_perf_accumulated_time, SUN_CLS, "time");
       
  1661     NEWPERFTICKCOUNTER(_perf_class_init_time, SUN_CLS, "classInitTime");
       
  1662     NEWPERFTICKCOUNTER(_perf_class_init_selftime, SUN_CLS, "classInitTime.self");
       
  1663     NEWPERFTICKCOUNTER(_perf_class_verify_time, SUN_CLS, "classVerifyTime");
       
  1664     NEWPERFTICKCOUNTER(_perf_class_verify_selftime, SUN_CLS, "classVerifyTime.self");
       
  1665     NEWPERFTICKCOUNTER(_perf_class_link_time, SUN_CLS, "classLinkedTime");
       
  1666     NEWPERFTICKCOUNTER(_perf_class_link_selftime, SUN_CLS, "classLinkedTime.self");
       
  1667     NEWPERFEVENTCOUNTER(_perf_classes_inited, SUN_CLS, "initializedClasses");
       
  1668     NEWPERFEVENTCOUNTER(_perf_classes_linked, SUN_CLS, "linkedClasses");
       
  1669     NEWPERFEVENTCOUNTER(_perf_classes_verified, SUN_CLS, "verifiedClasses");
       
  1670 
       
  1671     NEWPERFTICKCOUNTER(_perf_class_parse_time, SUN_CLS, "parseClassTime");
       
  1672     NEWPERFTICKCOUNTER(_perf_class_parse_selftime, SUN_CLS, "parseClassTime.self");
       
  1673     NEWPERFTICKCOUNTER(_perf_sys_class_lookup_time, SUN_CLS, "lookupSysClassTime");
       
  1674     NEWPERFTICKCOUNTER(_perf_shared_classload_time, SUN_CLS, "sharedClassLoadTime");
       
  1675     NEWPERFTICKCOUNTER(_perf_sys_classload_time, SUN_CLS, "sysClassLoadTime");
       
  1676     NEWPERFTICKCOUNTER(_perf_app_classload_time, SUN_CLS, "appClassLoadTime");
       
  1677     NEWPERFTICKCOUNTER(_perf_app_classload_selftime, SUN_CLS, "appClassLoadTime.self");
       
  1678     NEWPERFEVENTCOUNTER(_perf_app_classload_count, SUN_CLS, "appClassLoadCount");
       
  1679     NEWPERFTICKCOUNTER(_perf_define_appclasses, SUN_CLS, "defineAppClasses");
       
  1680     NEWPERFTICKCOUNTER(_perf_define_appclass_time, SUN_CLS, "defineAppClassTime");
       
  1681     NEWPERFTICKCOUNTER(_perf_define_appclass_selftime, SUN_CLS, "defineAppClassTime.self");
       
  1682     NEWPERFBYTECOUNTER(_perf_app_classfile_bytes_read, SUN_CLS, "appClassBytes");
       
  1683     NEWPERFBYTECOUNTER(_perf_sys_classfile_bytes_read, SUN_CLS, "sysClassBytes");
       
  1684 
       
  1685 
       
  1686     // The following performance counters are added for measuring the impact
       
  1687     // of the bug fix of 6365597. They are mainly focused on finding out
       
  1688     // the behavior of system & user-defined classloader lock, whether
       
  1689     // ClassLoader.loadClass/findClass is being called synchronized or not.
       
  1690     // Also two additional counters are created to see whether 'UnsyncloadClass'
       
  1691     // flag is being set or not and how many times load_instance_class call
       
  1692     // fails with linkageError etc.
       
  1693     NEWPERFEVENTCOUNTER(_sync_systemLoaderLockContentionRate, SUN_CLS,
       
  1694                         "systemLoaderLockContentionRate");
       
  1695     NEWPERFEVENTCOUNTER(_sync_nonSystemLoaderLockContentionRate, SUN_CLS,
       
  1696                         "nonSystemLoaderLockContentionRate");
       
  1697     NEWPERFEVENTCOUNTER(_sync_JVMFindLoadedClassLockFreeCounter, SUN_CLS,
       
  1698                         "jvmFindLoadedClassNoLockCalls");
       
  1699     NEWPERFEVENTCOUNTER(_sync_JVMDefineClassLockFreeCounter, SUN_CLS,
       
  1700                         "jvmDefineClassNoLockCalls");
       
  1701 
       
  1702     NEWPERFEVENTCOUNTER(_sync_JNIDefineClassLockFreeCounter, SUN_CLS,
       
  1703                         "jniDefineClassNoLockCalls");
       
  1704 
       
  1705     NEWPERFEVENTCOUNTER(_unsafe_defineClassCallCounter, SUN_CLS,
       
  1706                         "unsafeDefineClassCalls");
       
  1707 
       
  1708     NEWPERFEVENTCOUNTER(_isUnsyncloadClass, SUN_CLS, "isUnsyncloadClassSet");
       
  1709     NEWPERFEVENTCOUNTER(_load_instance_class_failCounter, SUN_CLS,
       
  1710                         "loadInstanceClassFailRate");
       
  1711 
       
  1712     // increment the isUnsyncloadClass counter if UnsyncloadClass is set.
       
  1713     if (UnsyncloadClass) {
       
  1714       _isUnsyncloadClass->inc();
       
  1715     }
       
  1716   }
       
  1717 
       
  1718   // lookup zip library entry points
       
  1719   load_zip_library();
       
  1720   // lookup jimage library entry points
       
  1721   load_jimage_library();
       
  1722 #if INCLUDE_CDS
       
  1723   // initialize search path
       
  1724   if (DumpSharedSpaces) {
       
  1725     _shared_paths_misc_info = SharedClassUtil::allocate_shared_paths_misc_info();
       
  1726   }
       
  1727 #endif
       
  1728   setup_bootstrap_search_path();
       
  1729 }
       
  1730 
       
  1731 #if INCLUDE_CDS
       
  1732 void ClassLoader::initialize_shared_path() {
       
  1733   if (DumpSharedSpaces) {
       
  1734     _num_boot_entries = _num_entries;
       
  1735     ClassLoaderExt::setup_search_paths();
       
  1736     _shared_paths_misc_info->write_jint(0); // see comments in SharedPathsMiscInfo::check()
       
  1737   }
       
  1738 }
       
  1739 #endif
       
  1740 
       
  1741 jlong ClassLoader::classloader_time_ms() {
       
  1742   return UsePerfData ?
       
  1743     Management::ticks_to_ms(_perf_accumulated_time->get_value()) : -1;
       
  1744 }
       
  1745 
       
  1746 jlong ClassLoader::class_init_count() {
       
  1747   return UsePerfData ? _perf_classes_inited->get_value() : -1;
       
  1748 }
       
  1749 
       
  1750 jlong ClassLoader::class_init_time_ms() {
       
  1751   return UsePerfData ?
       
  1752     Management::ticks_to_ms(_perf_class_init_time->get_value()) : -1;
       
  1753 }
       
  1754 
       
  1755 jlong ClassLoader::class_verify_time_ms() {
       
  1756   return UsePerfData ?
       
  1757     Management::ticks_to_ms(_perf_class_verify_time->get_value()) : -1;
       
  1758 }
       
  1759 
       
  1760 jlong ClassLoader::class_link_count() {
       
  1761   return UsePerfData ? _perf_classes_linked->get_value() : -1;
       
  1762 }
       
  1763 
       
  1764 jlong ClassLoader::class_link_time_ms() {
       
  1765   return UsePerfData ?
       
  1766     Management::ticks_to_ms(_perf_class_link_time->get_value()) : -1;
       
  1767 }
       
  1768 
       
  1769 int ClassLoader::compute_Object_vtable() {
       
  1770   // hardwired for JDK1.2 -- would need to duplicate class file parsing
       
  1771   // code to determine actual value from file
       
  1772   // Would be value '11' if finals were in vtable
       
  1773   int JDK_1_2_Object_vtable_size = 5;
       
  1774   return JDK_1_2_Object_vtable_size * vtableEntry::size();
       
  1775 }
       
  1776 
       
  1777 
       
  1778 void classLoader_init1() {
       
  1779   ClassLoader::initialize();
       
  1780 }
       
  1781 
       
  1782 // Complete the ClassPathEntry setup for the boot loader
       
  1783 void ClassLoader::classLoader_init2(TRAPS) {
       
  1784   // Setup the list of module/path pairs for --patch-module processing
       
  1785   // This must be done after the SymbolTable is created in order
       
  1786   // to use fast_compare on module names instead of a string compare.
       
  1787   if (Arguments::get_patch_mod_prefix() != NULL) {
       
  1788     setup_patch_mod_entries();
       
  1789   }
       
  1790 
       
  1791   // Create the ModuleEntry for java.base (must occur after setup_patch_mod_entries
       
  1792   // to successfully determine if java.base has been patched)
       
  1793   create_javabase();
       
  1794 
       
  1795   // Setup the initial java.base/path pair for the exploded build entries.
       
  1796   // As more modules are defined during module system initialization, more
       
  1797   // entries will be added to the exploded build array.
       
  1798   if (!has_jrt_entry()) {
       
  1799     assert(!DumpSharedSpaces, "DumpSharedSpaces not supported with exploded module builds");
       
  1800     assert(!UseSharedSpaces, "UsedSharedSpaces not supported with exploded module builds");
       
  1801     // Set up the boot loader's _exploded_entries list.  Note that this gets
       
  1802     // done before loading any classes, by the same thread that will
       
  1803     // subsequently do the first class load. So, no lock is needed for this.
       
  1804     assert(_exploded_entries == NULL, "Should only get initialized once");
       
  1805     _exploded_entries = new (ResourceObj::C_HEAP, mtModule)
       
  1806       GrowableArray<ModuleClassPathList*>(EXPLODED_ENTRY_SIZE, true);
       
  1807     add_to_exploded_build_list(vmSymbols::java_base(), CHECK);
       
  1808   }
       
  1809 }
       
  1810 
       
  1811 
       
  1812 bool ClassLoader::get_canonical_path(const char* orig, char* out, int len) {
       
  1813   assert(orig != NULL && out != NULL && len > 0, "bad arguments");
       
  1814   if (CanonicalizeEntry != NULL) {
       
  1815     JavaThread* THREAD = JavaThread::current();
       
  1816     JNIEnv* env = THREAD->jni_environment();
       
  1817     ResourceMark rm(THREAD);
       
  1818 
       
  1819     // os::native_path writes into orig_copy
       
  1820     char* orig_copy = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, strlen(orig)+1);
       
  1821     strcpy(orig_copy, orig);
       
  1822     if ((CanonicalizeEntry)(env, os::native_path(orig_copy), out, len) < 0) {
       
  1823       return false;
       
  1824     }
       
  1825   } else {
       
  1826     // On JDK 1.2.2 the Canonicalize does not exist, so just do nothing
       
  1827     strncpy(out, orig, len);
       
  1828     out[len - 1] = '\0';
       
  1829   }
       
  1830   return true;
       
  1831 }
       
  1832 
       
  1833 void ClassLoader::create_javabase() {
       
  1834   Thread* THREAD = Thread::current();
       
  1835 
       
  1836   // Create java.base's module entry for the boot
       
  1837   // class loader prior to loading j.l.Ojbect.
       
  1838   ClassLoaderData* null_cld = ClassLoaderData::the_null_class_loader_data();
       
  1839 
       
  1840   // Get module entry table
       
  1841   ModuleEntryTable* null_cld_modules = null_cld->modules();
       
  1842   if (null_cld_modules == NULL) {
       
  1843     vm_exit_during_initialization("No ModuleEntryTable for the boot class loader");
       
  1844   }
       
  1845 
       
  1846   {
       
  1847     MutexLocker ml(Module_lock, THREAD);
       
  1848     ModuleEntry* jb_module = null_cld_modules->locked_create_entry_or_null(Handle(),
       
  1849                                false, vmSymbols::java_base(), NULL, NULL, null_cld);
       
  1850     if (jb_module == NULL) {
       
  1851       vm_exit_during_initialization("Unable to create ModuleEntry for " JAVA_BASE_NAME);
       
  1852     }
       
  1853     ModuleEntryTable::set_javabase_moduleEntry(jb_module);
       
  1854   }
       
  1855 }
       
  1856 
       
  1857 #ifndef PRODUCT
       
  1858 
       
  1859 // CompileTheWorld
       
  1860 //
       
  1861 // Iterates over all class path entries and forces compilation of all methods
       
  1862 // in all classes found. Currently, only zip/jar archives are searched.
       
  1863 //
       
  1864 // The classes are loaded by the Java level bootstrap class loader, and the
       
  1865 // initializer is called. If DelayCompilationDuringStartup is true (default),
       
  1866 // the interpreter will run the initialization code. Note that forcing
       
  1867 // initialization in this way could potentially lead to initialization order
       
  1868 // problems, in which case we could just force the initialization bit to be set.
       
  1869 
       
  1870 
       
  1871 // We need to iterate over the contents of a zip/jar file, so we replicate the
       
  1872 // jzcell and jzfile definitions from zip_util.h but rename jzfile to real_jzfile,
       
  1873 // since jzfile already has a void* definition.
       
  1874 //
       
  1875 // Note that this is only used in debug mode.
       
  1876 //
       
  1877 // HotSpot integration note:
       
  1878 // Matches zip_util.h 1.14 99/06/01 from jdk1.3 beta H build
       
  1879 
       
  1880 
       
  1881 // JDK 1.3 version
       
  1882 typedef struct real_jzentry {         /* Zip file entry */
       
  1883     char *name;                 /* entry name */
       
  1884     jint time;                  /* modification time */
       
  1885     jint size;                  /* size of uncompressed data */
       
  1886     jint csize;                 /* size of compressed data (zero if uncompressed) */
       
  1887     jint crc;                   /* crc of uncompressed data */
       
  1888     char *comment;              /* optional zip file comment */
       
  1889     jbyte *extra;               /* optional extra data */
       
  1890     jint pos;                   /* position of LOC header (if negative) or data */
       
  1891 } real_jzentry;
       
  1892 
       
  1893 typedef struct real_jzfile {  /* Zip file */
       
  1894     char *name;                 /* zip file name */
       
  1895     jint refs;                  /* number of active references */
       
  1896     jint fd;                    /* open file descriptor */
       
  1897     void *lock;                 /* read lock */
       
  1898     char *comment;              /* zip file comment */
       
  1899     char *msg;                  /* zip error message */
       
  1900     void *entries;              /* array of hash cells */
       
  1901     jint total;                 /* total number of entries */
       
  1902     unsigned short *table;      /* Hash chain heads: indexes into entries */
       
  1903     jint tablelen;              /* number of hash eads */
       
  1904     real_jzfile *next;        /* next zip file in search list */
       
  1905     jzentry *cache;             /* we cache the most recently freed jzentry */
       
  1906     /* Information on metadata names in META-INF directory */
       
  1907     char **metanames;           /* array of meta names (may have null names) */
       
  1908     jint metacount;             /* number of slots in metanames array */
       
  1909     /* If there are any per-entry comments, they are in the comments array */
       
  1910     char **comments;
       
  1911 } real_jzfile;
       
  1912 
       
  1913 void ClassPathDirEntry::compile_the_world(Handle loader, TRAPS) {
       
  1914   // For now we only compile all methods in all classes in zip/jar files
       
  1915   tty->print_cr("CompileTheWorld : Skipped classes in %s", _dir);
       
  1916   tty->cr();
       
  1917 }
       
  1918 
       
  1919 void ClassPathZipEntry::compile_the_world(Handle loader, TRAPS) {
       
  1920   real_jzfile* zip = (real_jzfile*) _zip;
       
  1921   tty->print_cr("CompileTheWorld : Compiling all classes in %s", zip->name);
       
  1922   tty->cr();
       
  1923   // Iterate over all entries in zip file
       
  1924   for (int n = 0; ; n++) {
       
  1925     real_jzentry * ze = (real_jzentry *)((*GetNextEntry)(_zip, n));
       
  1926     if (ze == NULL) break;
       
  1927     ClassLoader::compile_the_world_in(ze->name, loader, CHECK);
       
  1928   }
       
  1929   if (HAS_PENDING_EXCEPTION) {
       
  1930     if (PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())) {
       
  1931       CLEAR_PENDING_EXCEPTION;
       
  1932       tty->print_cr("\nCompileTheWorld : Ran out of memory\n");
       
  1933       tty->print_cr("Increase class metadata storage if a limit was set");
       
  1934     } else {
       
  1935       tty->print_cr("\nCompileTheWorld : Unexpected exception occurred\n");
       
  1936     }
       
  1937   }
       
  1938 }
       
  1939 
       
  1940 void ClassLoader::compile_the_world() {
       
  1941   EXCEPTION_MARK;
       
  1942   HandleMark hm(THREAD);
       
  1943   ResourceMark rm(THREAD);
       
  1944 
       
  1945   assert(has_jrt_entry(), "Compile The World not supported with exploded module build");
       
  1946 
       
  1947   // Find bootstrap loader
       
  1948   Handle system_class_loader (THREAD, SystemDictionary::java_system_loader());
       
  1949   jlong start = os::javaTimeMillis();
       
  1950 
       
  1951   // Compile the world for the modular java runtime image
       
  1952   _jrt_entry->compile_the_world(system_class_loader, CATCH);
       
  1953 
       
  1954   // Iterate over all bootstrap class path appended entries
       
  1955   ClassPathEntry* e = _first_append_entry;
       
  1956   while (e != NULL) {
       
  1957     assert(!e->is_jrt(), "A modular java runtime image is present on the list of appended entries");
       
  1958     e->compile_the_world(system_class_loader, CATCH);
       
  1959     e = e->next();
       
  1960   }
       
  1961   jlong end = os::javaTimeMillis();
       
  1962   tty->print_cr("CompileTheWorld : Done (%d classes, %d methods, " JLONG_FORMAT " ms)",
       
  1963                 _compile_the_world_class_counter, _compile_the_world_method_counter, (end - start));
       
  1964   {
       
  1965     // Print statistics as if before normal exit:
       
  1966     extern void print_statistics();
       
  1967     print_statistics();
       
  1968   }
       
  1969   vm_exit(0);
       
  1970 }
       
  1971 
       
  1972 int ClassLoader::_compile_the_world_class_counter = 0;
       
  1973 int ClassLoader::_compile_the_world_method_counter = 0;
       
  1974 static int _codecache_sweep_counter = 0;
       
  1975 
       
  1976 // Filter out all exceptions except OOMs
       
  1977 static void clear_pending_exception_if_not_oom(TRAPS) {
       
  1978   if (HAS_PENDING_EXCEPTION &&
       
  1979       !PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())) {
       
  1980     CLEAR_PENDING_EXCEPTION;
       
  1981   }
       
  1982   // The CHECK at the caller will propagate the exception out
       
  1983 }
       
  1984 
       
  1985 /**
       
  1986  * Returns if the given method should be compiled when doing compile-the-world.
       
  1987  *
       
  1988  * TODO:  This should be a private method in a CompileTheWorld class.
       
  1989  */
       
  1990 static bool can_be_compiled(const methodHandle& m, int comp_level) {
       
  1991   assert(CompileTheWorld, "must be");
       
  1992 
       
  1993   // It's not valid to compile a native wrapper for MethodHandle methods
       
  1994   // that take a MemberName appendix since the bytecode signature is not
       
  1995   // correct.
       
  1996   vmIntrinsics::ID iid = m->intrinsic_id();
       
  1997   if (MethodHandles::is_signature_polymorphic(iid) && MethodHandles::has_member_arg(iid)) {
       
  1998     return false;
       
  1999   }
       
  2000 
       
  2001   return CompilationPolicy::can_be_compiled(m, comp_level);
       
  2002 }
       
  2003 
       
  2004 void ClassLoader::compile_the_world_in(char* name, Handle loader, TRAPS) {
       
  2005   if (string_ends_with(name, ".class")) {
       
  2006     // We have a .class file
       
  2007     int len = (int)strlen(name);
       
  2008     char buffer[2048];
       
  2009     strncpy(buffer, name, len - 6);
       
  2010     buffer[len-6] = 0;
       
  2011     // If the file has a period after removing .class, it's not really a
       
  2012     // valid class file.  The class loader will check everything else.
       
  2013     if (strchr(buffer, '.') == NULL) {
       
  2014       _compile_the_world_class_counter++;
       
  2015       if (_compile_the_world_class_counter > CompileTheWorldStopAt) return;
       
  2016 
       
  2017       // Construct name without extension
       
  2018       TempNewSymbol sym = SymbolTable::new_symbol(buffer, CHECK);
       
  2019       // Use loader to load and initialize class
       
  2020       Klass* k = SystemDictionary::resolve_or_null(sym, loader, Handle(), THREAD);
       
  2021       if (k != NULL && !HAS_PENDING_EXCEPTION) {
       
  2022         k->initialize(THREAD);
       
  2023       }
       
  2024       bool exception_occurred = HAS_PENDING_EXCEPTION;
       
  2025       clear_pending_exception_if_not_oom(CHECK);
       
  2026       if (CompileTheWorldPreloadClasses && k != NULL) {
       
  2027         InstanceKlass* ik = InstanceKlass::cast(k);
       
  2028         ConstantPool::preload_and_initialize_all_classes(ik->constants(), THREAD);
       
  2029         if (HAS_PENDING_EXCEPTION) {
       
  2030           // If something went wrong in preloading we just ignore it
       
  2031           clear_pending_exception_if_not_oom(CHECK);
       
  2032           tty->print_cr("Preloading failed for (%d) %s", _compile_the_world_class_counter, buffer);
       
  2033         }
       
  2034       }
       
  2035 
       
  2036       if (_compile_the_world_class_counter >= CompileTheWorldStartAt) {
       
  2037         if (k == NULL || exception_occurred) {
       
  2038           // If something went wrong (e.g. ExceptionInInitializerError) we skip this class
       
  2039           tty->print_cr("CompileTheWorld (%d) : Skipping %s", _compile_the_world_class_counter, buffer);
       
  2040         } else {
       
  2041           tty->print_cr("CompileTheWorld (%d) : %s", _compile_the_world_class_counter, buffer);
       
  2042           // Preload all classes to get around uncommon traps
       
  2043           // Iterate over all methods in class
       
  2044           int comp_level = CompilationPolicy::policy()->initial_compile_level();
       
  2045           InstanceKlass* ik = InstanceKlass::cast(k);
       
  2046           for (int n = 0; n < ik->methods()->length(); n++) {
       
  2047             methodHandle m (THREAD, ik->methods()->at(n));
       
  2048             if (can_be_compiled(m, comp_level)) {
       
  2049               if (++_codecache_sweep_counter == CompileTheWorldSafepointInterval) {
       
  2050                 // Give sweeper a chance to keep up with CTW
       
  2051                 VM_CTWThreshold op;
       
  2052                 VMThread::execute(&op);
       
  2053                 _codecache_sweep_counter = 0;
       
  2054               }
       
  2055               // Force compilation
       
  2056               CompileBroker::compile_method(m, InvocationEntryBci, comp_level,
       
  2057                                             methodHandle(), 0, CompileTask::Reason_CTW, THREAD);
       
  2058               if (HAS_PENDING_EXCEPTION) {
       
  2059                 clear_pending_exception_if_not_oom(CHECK);
       
  2060                 tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_class_counter, m->name_and_sig_as_C_string());
       
  2061               } else {
       
  2062                 _compile_the_world_method_counter++;
       
  2063               }
       
  2064               if (TieredCompilation && TieredStopAtLevel >= CompLevel_full_optimization) {
       
  2065                 // Clobber the first compile and force second tier compilation
       
  2066                 CompiledMethod* nm = m->code();
       
  2067                 if (nm != NULL && !m->is_method_handle_intrinsic()) {
       
  2068                   // Throw out the code so that the code cache doesn't fill up
       
  2069                   nm->make_not_entrant();
       
  2070                 }
       
  2071                 CompileBroker::compile_method(m, InvocationEntryBci, CompLevel_full_optimization,
       
  2072                                               methodHandle(), 0, CompileTask::Reason_CTW, THREAD);
       
  2073                 if (HAS_PENDING_EXCEPTION) {
       
  2074                   clear_pending_exception_if_not_oom(CHECK);
       
  2075                   tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_class_counter, m->name_and_sig_as_C_string());
       
  2076                 } else {
       
  2077                   _compile_the_world_method_counter++;
       
  2078                 }
       
  2079               }
       
  2080             } else {
       
  2081               tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_class_counter, m->name_and_sig_as_C_string());
       
  2082             }
       
  2083 
       
  2084             CompiledMethod* nm = m->code();
       
  2085             if (nm != NULL && !m->is_method_handle_intrinsic()) {
       
  2086               // Throw out the code so that the code cache doesn't fill up
       
  2087               nm->make_not_entrant();
       
  2088             }
       
  2089           }
       
  2090         }
       
  2091       }
       
  2092     }
       
  2093   }
       
  2094 }
       
  2095 
       
  2096 #endif //PRODUCT
       
  2097 
       
  2098 // Please keep following two functions at end of this file. With them placed at top or in middle of the file,
       
  2099 // they could get inlined by agressive compiler, an unknown trick, see bug 6966589.
       
  2100 void PerfClassTraceTime::initialize() {
       
  2101   if (!UsePerfData) return;
       
  2102 
       
  2103   if (_eventp != NULL) {
       
  2104     // increment the event counter
       
  2105     _eventp->inc();
       
  2106   }
       
  2107 
       
  2108   // stop the current active thread-local timer to measure inclusive time
       
  2109   _prev_active_event = -1;
       
  2110   for (int i=0; i < EVENT_TYPE_COUNT; i++) {
       
  2111      if (_timers[i].is_active()) {
       
  2112        assert(_prev_active_event == -1, "should have only one active timer");
       
  2113        _prev_active_event = i;
       
  2114        _timers[i].stop();
       
  2115      }
       
  2116   }
       
  2117 
       
  2118   if (_recursion_counters == NULL || (_recursion_counters[_event_type])++ == 0) {
       
  2119     // start the inclusive timer if not recursively called
       
  2120     _t.start();
       
  2121   }
       
  2122 
       
  2123   // start thread-local timer of the given event type
       
  2124    if (!_timers[_event_type].is_active()) {
       
  2125     _timers[_event_type].start();
       
  2126   }
       
  2127 }
       
  2128 
       
  2129 PerfClassTraceTime::~PerfClassTraceTime() {
       
  2130   if (!UsePerfData) return;
       
  2131 
       
  2132   // stop the thread-local timer as the event completes
       
  2133   // and resume the thread-local timer of the event next on the stack
       
  2134   _timers[_event_type].stop();
       
  2135   jlong selftime = _timers[_event_type].ticks();
       
  2136 
       
  2137   if (_prev_active_event >= 0) {
       
  2138     _timers[_prev_active_event].start();
       
  2139   }
       
  2140 
       
  2141   if (_recursion_counters != NULL && --(_recursion_counters[_event_type]) > 0) return;
       
  2142 
       
  2143   // increment the counters only on the leaf call
       
  2144   _t.stop();
       
  2145   _timep->inc(_t.ticks());
       
  2146   if (_selftimep != NULL) {
       
  2147     _selftimep->inc(selftime);
       
  2148   }
       
  2149   // add all class loading related event selftime to the accumulated time counter
       
  2150   ClassLoader::perf_accumulated_time()->inc(selftime);
       
  2151 
       
  2152   // reset the timer
       
  2153   _timers[_event_type].reset();
       
  2154 }