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); |