hotspot/src/share/vm/classfile/packageEntry.hpp
changeset 38733 2b65f4db449e
parent 37503 77531df4dad3
child 38940 7de797f32b5f
equal deleted inserted replaced
38732:bb77e0dcc7e5 38733:2b65f4db449e
    45 //   - qualified exports:   (_qualified_exports != NULL || _is_exported_allUnnamed is true) && _is_exported is true
    45 //   - qualified exports:   (_qualified_exports != NULL || _is_exported_allUnnamed is true) && _is_exported is true
    46 //   - unqualified exports: (_qualified_exports = NULL && _is_exported_allUnnamed is false) && _is_exported is true
    46 //   - unqualified exports: (_qualified_exports = NULL && _is_exported_allUnnamed is false) && _is_exported is true
    47 //
    47 //
    48 // The Mutex Module_lock is shared between ModuleEntry and PackageEntry, to lock either
    48 // The Mutex Module_lock is shared between ModuleEntry and PackageEntry, to lock either
    49 // data structure.
    49 // data structure.
    50 class PackageEntry : public HashtableEntry<Symbol*, mtClass> {
    50 class PackageEntry : public HashtableEntry<Symbol*, mtModule> {
    51 private:
    51 private:
    52   ModuleEntry* _module;
    52   ModuleEntry* _module;
    53   // Used to indicate for packages with classes loaded by the boot loader that
    53   // Used to indicate for packages with classes loaded by the boot loader that
    54   // a class in that package has been loaded.  And, for packages with classes
    54   // a class in that package has been loaded.  And, for packages with classes
    55   // loaded by the boot loader from -Xbootclasspath/a in an unnamed module, it
    55   // loaded by the boot loader from -Xbootclasspath/a in an unnamed module, it
   127 
   127 
   128   // add the module to the package's qualified exports
   128   // add the module to the package's qualified exports
   129   void add_qexport(ModuleEntry* m);
   129   void add_qexport(ModuleEntry* m);
   130 
   130 
   131   PackageEntry* next() const {
   131   PackageEntry* next() const {
   132     return (PackageEntry*)HashtableEntry<Symbol*, mtClass>::next();
   132     return (PackageEntry*)HashtableEntry<Symbol*, mtModule>::next();
   133   }
   133   }
   134 
   134 
   135   PackageEntry** next_addr() {
   135   PackageEntry** next_addr() {
   136     return (PackageEntry**)HashtableEntry<Symbol*, mtClass>::next_addr();
   136     return (PackageEntry**)HashtableEntry<Symbol*, mtModule>::next_addr();
   137   }
   137   }
   138 
   138 
   139   // iteration of qualified exports
   139   // iteration of qualified exports
   140   void package_exports_do(ModuleClosure* const f);
   140   void package_exports_do(ModuleClosure* const f);
   141 
   141 
   151 
   151 
   152 // The PackageEntryTable is a Hashtable containing a list of all packages defined
   152 // The PackageEntryTable is a Hashtable containing a list of all packages defined
   153 // by a particular class loader.  Each package is represented as a PackageEntry node.
   153 // by a particular class loader.  Each package is represented as a PackageEntry node.
   154 // The PackageEntryTable's lookup is lock free.
   154 // The PackageEntryTable's lookup is lock free.
   155 //
   155 //
   156 class PackageEntryTable : public Hashtable<Symbol*, mtClass> {
   156 class PackageEntryTable : public Hashtable<Symbol*, mtModule> {
   157   friend class VMStructs;
   157   friend class VMStructs;
   158 public:
   158 public:
   159   enum Constants {
   159   enum Constants {
   160     _packagetable_entry_size = 1009  // number of entries in package entry table
   160     _packagetable_entry_size = 1009  // number of entries in package entry table
   161   };
   161   };
   162 
   162 
   163 private:
   163 private:
   164   PackageEntry* new_entry(unsigned int hash, Symbol* name, ModuleEntry* module);
   164   PackageEntry* new_entry(unsigned int hash, Symbol* name, ModuleEntry* module);
   165   void add_entry(int index, PackageEntry* new_entry);
   165   void add_entry(int index, PackageEntry* new_entry);
   166 
   166 
   167   int entry_size() const { return BasicHashtable<mtClass>::entry_size(); }
   167   int entry_size() const { return BasicHashtable<mtModule>::entry_size(); }
   168 
   168 
   169   PackageEntry** bucket_addr(int i) {
   169   PackageEntry** bucket_addr(int i) {
   170     return (PackageEntry**)Hashtable<Symbol*, mtClass>::bucket_addr(i);
   170     return (PackageEntry**)Hashtable<Symbol*, mtModule>::bucket_addr(i);
   171   }
   171   }
   172 
   172 
   173   static unsigned int compute_hash(Symbol* name) { return (unsigned int)(name->identity_hash()); }
   173   static unsigned int compute_hash(Symbol* name) { return (unsigned int)(name->identity_hash()); }
   174   int index_for(Symbol* name) const { return hash_to_index(compute_hash(name)); }
   174   int index_for(Symbol* name) const { return hash_to_index(compute_hash(name)); }
   175 
   175 
   176 public:
   176 public:
   177   PackageEntryTable(int table_size);
   177   PackageEntryTable(int table_size);
   178   ~PackageEntryTable();
   178   ~PackageEntryTable();
   179 
   179 
   180   PackageEntry* bucket(int i) {
   180   PackageEntry* bucket(int i) {
   181     return (PackageEntry*)Hashtable<Symbol*, mtClass>::bucket(i);
   181     return (PackageEntry*)Hashtable<Symbol*, mtModule>::bucket(i);
   182   }
   182   }
   183 
   183 
   184   // Create package in loader's package entry table and return the entry.
   184   // Create package in loader's package entry table and return the entry.
   185   // If entry already exists, return null.  Assume Module lock was taken by caller.
   185   // If entry already exists, return null.  Assume Module lock was taken by caller.
   186   PackageEntry* locked_create_entry_or_null(Symbol* name, ModuleEntry* module);
   186   PackageEntry* locked_create_entry_or_null(Symbol* name, ModuleEntry* module);