src/share/vm/classfile/classLoader.hpp

Sat, 01 Dec 2007 00:00:00 +0000

author
duke
date
Sat, 01 Dec 2007 00:00:00 +0000
changeset 435
a61af66fc99e
child 1310
6a93908f268f
permissions
-rw-r--r--

Initial load

     1 /*
     2  * Copyright 1997-2007 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
    20  * CA 95054 USA or visit www.sun.com if you need additional information or
    21  * have any questions.
    22  *
    23  */
    25 // The VM class loader.
    26 #include <sys/stat.h>
    29 // Meta-index (optional, to be able to skip opening boot classpath jar files)
    30 class MetaIndex: public CHeapObj {
    31  private:
    32   char** _meta_package_names;
    33   int    _num_meta_package_names;
    34  public:
    35   MetaIndex(char** meta_package_names, int num_meta_package_names);
    36   ~MetaIndex();
    37   bool may_contain(const char* class_name);
    38 };
    41 // Class path entry (directory or zip file)
    43 class ClassPathEntry: public CHeapObj {
    44  private:
    45   ClassPathEntry* _next;
    46  public:
    47   // Next entry in class path
    48   ClassPathEntry* next()              { return _next; }
    49   void set_next(ClassPathEntry* next) {
    50     // may have unlocked readers, so write atomically.
    51     OrderAccess::release_store_ptr(&_next, next);
    52   }
    53   virtual bool is_jar_file() = 0;
    54   virtual const char* name() = 0;
    55   virtual bool is_lazy();
    56   // Constructor
    57   ClassPathEntry();
    58   // Attempt to locate file_name through this class path entry.
    59   // Returns a class file parsing stream if successfull.
    60   virtual ClassFileStream* open_stream(const char* name) = 0;
    61   // Debugging
    62   NOT_PRODUCT(virtual void compile_the_world(Handle loader, TRAPS) = 0;)
    63   NOT_PRODUCT(virtual bool is_rt_jar() = 0;)
    64 };
    67 class ClassPathDirEntry: public ClassPathEntry {
    68  private:
    69   char* _dir;           // Name of directory
    70  public:
    71   bool is_jar_file()  { return false;  }
    72   const char* name()  { return _dir; }
    73   ClassPathDirEntry(char* dir);
    74   ClassFileStream* open_stream(const char* name);
    75   // Debugging
    76   NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
    77   NOT_PRODUCT(bool is_rt_jar();)
    78 };
    81 // Type definitions for zip file and zip file entry
    82 typedef void* jzfile;
    83 typedef struct {
    84   char *name;                   /* entry name */
    85   jlong time;                   /* modification time */
    86   jlong size;                   /* size of uncompressed data */
    87   jlong csize;                  /* size of compressed data (zero if uncompressed) */
    88   jint crc;                     /* crc of uncompressed data */
    89   char *comment;                /* optional zip file comment */
    90   jbyte *extra;                 /* optional extra data */
    91   jlong pos;                    /* position of LOC header (if negative) or data */
    92 } jzentry;
    95 class ClassPathZipEntry: public ClassPathEntry {
    96  private:
    97   jzfile* _zip;        // The zip archive
    98   char*   _zip_name;   // Name of zip archive
    99  public:
   100   bool is_jar_file()  { return true;  }
   101   const char* name()  { return _zip_name; }
   102   ClassPathZipEntry(jzfile* zip, const char* zip_name);
   103   ~ClassPathZipEntry();
   104   ClassFileStream* open_stream(const char* name);
   105   void contents_do(void f(const char* name, void* context), void* context);
   106   // Debugging
   107   NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
   108   NOT_PRODUCT(void compile_the_world12(Handle loader, TRAPS);) // JDK 1.2 version
   109   NOT_PRODUCT(void compile_the_world13(Handle loader, TRAPS);) // JDK 1.3 version
   110   NOT_PRODUCT(bool is_rt_jar();)
   111   NOT_PRODUCT(bool is_rt_jar12();)
   112   NOT_PRODUCT(bool is_rt_jar13();)
   113 };
   116 // For lazier loading of boot class path entries
   117 class LazyClassPathEntry: public ClassPathEntry {
   118  private:
   119   char* _path; // dir or file
   120   struct stat _st;
   121   MetaIndex* _meta_index;
   122   volatile ClassPathEntry* _resolved_entry;
   123   ClassPathEntry* resolve_entry();
   124  public:
   125   bool is_jar_file();
   126   const char* name()  { return _path; }
   127   LazyClassPathEntry(char* path, struct stat st);
   128   ClassFileStream* open_stream(const char* name);
   129   void set_meta_index(MetaIndex* meta_index) { _meta_index = meta_index; }
   130   virtual bool is_lazy();
   131   // Debugging
   132   NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
   133   NOT_PRODUCT(bool is_rt_jar();)
   134 };
   136 class PackageHashtable;
   137 class PackageInfo;
   138 class HashtableBucket;
   140 class ClassLoader: AllStatic {
   141  public:
   142   enum SomeConstants {
   143     package_hash_table_size = 31  // Number of buckets
   144   };
   145  private:
   146   friend class LazyClassPathEntry;
   148   // Performance counters
   149   static PerfCounter* _perf_accumulated_time;
   150   static PerfCounter* _perf_classes_inited;
   151   static PerfCounter* _perf_class_init_time;
   152   static PerfCounter* _perf_class_verify_time;
   153   static PerfCounter* _perf_classes_linked;
   154   static PerfCounter* _perf_class_link_time;
   156   static PerfCounter* _sync_systemLoaderLockContentionRate;
   157   static PerfCounter* _sync_nonSystemLoaderLockContentionRate;
   158   static PerfCounter* _sync_JVMFindLoadedClassLockFreeCounter;
   159   static PerfCounter* _sync_JVMDefineClassLockFreeCounter;
   160   static PerfCounter* _sync_JNIDefineClassLockFreeCounter;
   162   static PerfCounter* _unsafe_defineClassCallCounter;
   163   static PerfCounter* _isUnsyncloadClass;
   164   static PerfCounter* _load_instance_class_failCounter;
   166   // First entry in linked list of ClassPathEntry instances
   167   static ClassPathEntry* _first_entry;
   168   // Last entry in linked list of ClassPathEntry instances
   169   static ClassPathEntry* _last_entry;
   170   // Hash table used to keep track of loaded packages
   171   static PackageHashtable* _package_hash_table;
   172   static const char* _shared_archive;
   174   // Hash function
   175   static unsigned int hash(const char *s, int n);
   176   // Returns the package file name corresponding to the specified package
   177   // or class name, or null if not found.
   178   static PackageInfo* lookup_package(const char *pkgname);
   179   // Adds a new package entry for the specified class or package name and
   180   // corresponding directory or jar file name.
   181   static bool add_package(const char *pkgname, int classpath_index, TRAPS);
   183   // Initialization
   184   static void setup_meta_index();
   185   static void setup_bootstrap_search_path();
   186   static void load_zip_library();
   187   static void create_class_path_entry(char *path, struct stat st, ClassPathEntry **new_entry, bool lazy);
   189   // Canonicalizes path names, so strcmp will work properly. This is mainly
   190   // to avoid confusing the zip library
   191   static bool get_canonical_path(char* orig, char* out, int len);
   192  public:
   193   // Used by the kernel jvm.
   194   static void update_class_path_entry_list(const char *path,
   195                                            bool check_for_duplicates);
   196   static void print_bootclasspath();
   198   // Timing
   199   static PerfCounter* perf_accumulated_time()  { return _perf_accumulated_time; }
   200   static PerfCounter* perf_classes_inited()    { return _perf_classes_inited; }
   201   static PerfCounter* perf_class_init_time()   { return _perf_class_init_time; }
   202   static PerfCounter* perf_class_verify_time() { return _perf_class_verify_time; }
   203   static PerfCounter* perf_classes_linked()    { return _perf_classes_linked; }
   204   static PerfCounter* perf_class_link_time() { return _perf_class_link_time; }
   206   // Record how often system loader lock object is contended
   207   static PerfCounter* sync_systemLoaderLockContentionRate() {
   208     return _sync_systemLoaderLockContentionRate;
   209   }
   211   // Record how often non system loader lock object is contended
   212   static PerfCounter* sync_nonSystemLoaderLockContentionRate() {
   213     return _sync_nonSystemLoaderLockContentionRate;
   214   }
   216   // Record how many calls to JVM_FindLoadedClass w/o holding a lock
   217   static PerfCounter* sync_JVMFindLoadedClassLockFreeCounter() {
   218     return _sync_JVMFindLoadedClassLockFreeCounter;
   219   }
   221   // Record how many calls to JVM_DefineClass w/o holding a lock
   222   static PerfCounter* sync_JVMDefineClassLockFreeCounter() {
   223     return _sync_JVMDefineClassLockFreeCounter;
   224   }
   226   // Record how many calls to jni_DefineClass w/o holding a lock
   227   static PerfCounter* sync_JNIDefineClassLockFreeCounter() {
   228     return _sync_JNIDefineClassLockFreeCounter;
   229   }
   231   // Record how many calls to Unsafe_DefineClass
   232   static PerfCounter* unsafe_defineClassCallCounter() {
   233     return _unsafe_defineClassCallCounter;
   234   }
   236   // Record how many times SystemDictionary::load_instance_class call
   237   // fails with linkageError when Unsyncloadclass flag is set.
   238   static PerfCounter* load_instance_class_failCounter() {
   239     return _load_instance_class_failCounter;
   240   }
   242   // Load individual .class file
   243   static instanceKlassHandle load_classfile(symbolHandle h_name, TRAPS);
   245   // If the specified package has been loaded by the system, then returns
   246   // the name of the directory or ZIP file that the package was loaded from.
   247   // Returns null if the package was not loaded.
   248   // Note: The specified name can either be the name of a class or package.
   249   // If a package name is specified, then it must be "/"-separator and also
   250   // end with a trailing "/".
   251   static oop get_system_package(const char* name, TRAPS);
   253   // Returns an array of Java strings representing all of the currently
   254   // loaded system packages.
   255   // Note: The package names returned are "/"-separated and end with a
   256   // trailing "/".
   257   static objArrayOop get_system_packages(TRAPS);
   259   // Initialization
   260   static void initialize();
   261   static void create_package_info_table();
   262   static void create_package_info_table(HashtableBucket *t, int length,
   263                                         int number_of_entries);
   264   static int compute_Object_vtable();
   266   static ClassPathEntry* classpath_entry(int n) {
   267     ClassPathEntry* e = ClassLoader::_first_entry;
   268     while (--n >= 0) {
   269       assert(e != NULL, "Not that many classpath entries.");
   270       e = e->next();
   271     }
   272     return e;
   273   }
   275   // Sharing dump and restore
   276   static void copy_package_info_buckets(char** top, char* end);
   277   static void copy_package_info_table(char** top, char* end);
   279   // VM monitoring and management support
   280   static jlong classloader_time_ms();
   281   static jlong class_method_total_size();
   282   static jlong class_init_count();
   283   static jlong class_init_time_ms();
   284   static jlong class_verify_time_ms();
   285   static jlong class_link_count();
   286   static jlong class_link_time_ms();
   288   // indicates if class path already contains a entry (exact match by name)
   289   static bool contains_entry(ClassPathEntry* entry);
   291   // adds a class path list
   292   static void add_to_list(ClassPathEntry* new_entry);
   294   // creates a class path zip entry (returns NULL if JAR file cannot be opened)
   295   static ClassPathZipEntry* create_class_path_zip_entry(const char *apath);
   297   // Debugging
   298   static void verify()              PRODUCT_RETURN;
   300   // Force compilation of all methods in all classes in bootstrap class path (stress test)
   301 #ifndef PRODUCT
   302  private:
   303   static int _compile_the_world_counter;
   304  public:
   305   static void compile_the_world();
   306   static void compile_the_world_in(char* name, Handle loader, TRAPS);
   307   static int  compile_the_world_counter() { return _compile_the_world_counter; }
   308 #endif //PRODUCT
   309 };

mercurial