108
109 // Set the package as exported to all unnamed modules unless the package is
110 // already unqualifiedly exported.
111 void PackageEntry::set_is_exported_allUnnamed() {
112 if (module()->is_open()) {
113 // No-op for open modules since all packages are unqualifiedly exported
114 return;
115 }
116
117 MutexLocker m1(Module_lock);
118 if (!is_unqual_exported()) {
119 _export_flags = PKG_EXP_ALLUNNAMED;
120 }
121 }
122
123 // Remove dead module entries within the package's exported list. Note that
124 // if all of the modules on the _qualified_exports get purged the list does not
125 // get deleted. This prevents the package from illegally transitioning from
126 // exported to non-exported.
127 void PackageEntry::purge_qualified_exports() {
128 assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
129 if (_must_walk_exports &&
130 _qualified_exports != NULL &&
131 !_qualified_exports->is_empty()) {
132 ModuleEntry* pkg_module = module();
133
134 // This package's _must_walk_exports flag will be reset based
135 // on the remaining live modules on the exports list.
136 _must_walk_exports = false;
137
138 if (log_is_enabled(Trace, module)) {
139 ResourceMark rm;
140 assert(name() != NULL, "PackageEntry without a valid name");
141 ModuleEntry* pkg_mod = module();
142 log_trace(module)("PackageEntry::purge_qualified_exports(): package %s defined in module %s, exports list being walked",
143 name()->as_C_string(),
144 (pkg_mod == NULL || pkg_mod->name() == NULL) ? UNNAMED_MODULE : pkg_mod->name()->as_C_string());
145 }
146
147 // Go backwards because this removes entries that are dead.
148 int len = _qualified_exports->length();
149 for (int idx = len - 1; idx >= 0; idx--) {
150 ModuleEntry* module_idx = _qualified_exports->at(idx);
151 ClassLoaderData* cld_idx = module_idx->loader_data();
152 if (cld_idx->is_unloading()) {
153 _qualified_exports->delete_at(idx);
154 } else {
155 // Update the need to walk this package's exports based on live modules
156 set_export_walk_required(cld_idx);
157 }
158 }
159 }
160 }
161
162 void PackageEntry::delete_qualified_exports() {
163 assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
164 if (_qualified_exports != NULL) {
165 delete _qualified_exports;
166 }
167 _qualified_exports = NULL;
168 }
169
170 PackageEntryTable::PackageEntryTable(int table_size)
171 : Hashtable<Symbol*, mtModule>(table_size, sizeof(PackageEntry))
172 {
173 }
174
175 PackageEntryTable::~PackageEntryTable() {
176 // Walk through all buckets and all entries in each bucket,
177 // freeing each entry.
178 for (int i = 0; i < table_size(); ++i) {
179 for (PackageEntry* p = bucket(i); p != NULL;) {
180 PackageEntry* to_remove = p;
181 // read next before freeing.
182 p = p->next();
183
211 void PackageEntryTable::add_entry(int index, PackageEntry* new_entry) {
212 assert(Module_lock->owned_by_self(), "should have the Module_lock");
213 Hashtable<Symbol*, mtModule>::add_entry(index, (HashtableEntry<Symbol*, mtModule>*)new_entry);
214 }
215
216 // Create package in loader's package entry table and return the entry.
217 // If entry already exists, return null. Assume Module lock was taken by caller.
218 PackageEntry* PackageEntryTable::locked_create_entry_or_null(Symbol* name, ModuleEntry* module) {
219 assert(Module_lock->owned_by_self(), "should have the Module_lock");
220 // Check if package already exists. Return NULL if it does.
221 if (lookup_only(name) != NULL) {
222 return NULL;
223 } else {
224 PackageEntry* entry = new_entry(compute_hash(name), name, module);
225 add_entry(index_for(name), entry);
226 return entry;
227 }
228 }
229
230 PackageEntry* PackageEntryTable::lookup(Symbol* name, ModuleEntry* module) {
231 PackageEntry* p = lookup_only(name);
232 if (p != NULL) {
233 return p;
234 } else {
235 // If not found, add to table. Grab the PackageEntryTable lock first.
236 MutexLocker ml(Module_lock);
237
238 // Since look-up was done lock-free, we need to check if another thread beat
239 // us in the race to insert the package.
240 PackageEntry* test = lookup_only(name);
241 if (test != NULL) {
242 // A race occurred and another thread introduced the package.
243 return test;
244 } else {
245 assert(module != NULL, "module should never be null");
246 PackageEntry* entry = new_entry(compute_hash(name), name, module);
247 add_entry(index_for(name), entry);
248 return entry;
249 }
250 }
251 }
252
253 PackageEntry* PackageEntryTable::lookup_only(Symbol* name) {
254 int index = index_for(name);
255 for (PackageEntry* p = bucket(index); p != NULL; p = p->next()) {
256 if (p->name()->fast_compare(name) == 0) {
257 return p;
258 }
259 }
260 return NULL;
261 }
262
263 // Called when a define module for java.base is being processed.
264 // Verify the packages loaded thus far are in java.base's package list.
265 void PackageEntryTable::verify_javabase_packages(GrowableArray<Symbol*> *pkg_list) {
266 assert_lock_strong(Module_lock);
267 for (int i = 0; i < table_size(); i++) {
268 for (PackageEntry* entry = bucket(i);
269 entry != NULL;
270 entry = entry->next()) {
271 ModuleEntry* m = entry->module();
272 Symbol* module_name = (m == NULL ? NULL : m->name());
273 if (module_name != NULL &&
279 }
280 }
281
282 }
283
284 // iteration of qualified exports
285 void PackageEntry::package_exports_do(ModuleClosure* f) {
286 assert_locked_or_safepoint(Module_lock);
287 assert(f != NULL, "invariant");
288
289 if (has_qual_exports_list()) {
290 int qe_len = _qualified_exports->length();
291
292 for (int i = 0; i < qe_len; ++i) {
293 f->do_module(_qualified_exports->at(i));
294 }
295 }
296 }
297
298 bool PackageEntry::exported_pending_delete() const {
299 assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
300 return (is_unqual_exported() && _qualified_exports != NULL);
301 }
302
303 // Remove dead entries from all packages' exported list
304 void PackageEntryTable::purge_all_package_exports() {
305 assert_locked_or_safepoint(Module_lock);
306 for (int i = 0; i < table_size(); i++) {
307 for (PackageEntry* entry = bucket(i);
308 entry != NULL;
309 entry = entry->next()) {
310 if (entry->exported_pending_delete()) {
311 // exported list is pending deletion due to a transition
312 // from qualified to unqualified
313 entry->delete_qualified_exports();
314 } else if (entry->is_qual_exported()) {
315 entry->purge_qualified_exports();
316 }
317 }
318 }
319 }
|
108
109 // Set the package as exported to all unnamed modules unless the package is
110 // already unqualifiedly exported.
111 void PackageEntry::set_is_exported_allUnnamed() {
112 if (module()->is_open()) {
113 // No-op for open modules since all packages are unqualifiedly exported
114 return;
115 }
116
117 MutexLocker m1(Module_lock);
118 if (!is_unqual_exported()) {
119 _export_flags = PKG_EXP_ALLUNNAMED;
120 }
121 }
122
123 // Remove dead module entries within the package's exported list. Note that
124 // if all of the modules on the _qualified_exports get purged the list does not
125 // get deleted. This prevents the package from illegally transitioning from
126 // exported to non-exported.
127 void PackageEntry::purge_qualified_exports() {
128 assert_locked_or_safepoint(Module_lock);
129 if (_must_walk_exports &&
130 _qualified_exports != NULL &&
131 !_qualified_exports->is_empty()) {
132 ModuleEntry* pkg_module = module();
133
134 // This package's _must_walk_exports flag will be reset based
135 // on the remaining live modules on the exports list.
136 _must_walk_exports = false;
137
138 if (log_is_enabled(Trace, module)) {
139 ResourceMark rm;
140 assert(name() != NULL, "PackageEntry without a valid name");
141 ModuleEntry* pkg_mod = module();
142 log_trace(module)("PackageEntry::purge_qualified_exports(): package %s defined in module %s, exports list being walked",
143 name()->as_C_string(),
144 (pkg_mod == NULL || pkg_mod->name() == NULL) ? UNNAMED_MODULE : pkg_mod->name()->as_C_string());
145 }
146
147 // Go backwards because this removes entries that are dead.
148 int len = _qualified_exports->length();
149 for (int idx = len - 1; idx >= 0; idx--) {
150 ModuleEntry* module_idx = _qualified_exports->at(idx);
151 ClassLoaderData* cld_idx = module_idx->loader_data();
152 if (cld_idx->is_unloading()) {
153 _qualified_exports->delete_at(idx);
154 } else {
155 // Update the need to walk this package's exports based on live modules
156 set_export_walk_required(cld_idx);
157 }
158 }
159 }
160 }
161
162 void PackageEntry::delete_qualified_exports() {
163 if (_qualified_exports != NULL) {
164 delete _qualified_exports;
165 }
166 _qualified_exports = NULL;
167 }
168
169 PackageEntryTable::PackageEntryTable(int table_size)
170 : Hashtable<Symbol*, mtModule>(table_size, sizeof(PackageEntry))
171 {
172 }
173
174 PackageEntryTable::~PackageEntryTable() {
175 // Walk through all buckets and all entries in each bucket,
176 // freeing each entry.
177 for (int i = 0; i < table_size(); ++i) {
178 for (PackageEntry* p = bucket(i); p != NULL;) {
179 PackageEntry* to_remove = p;
180 // read next before freeing.
181 p = p->next();
182
210 void PackageEntryTable::add_entry(int index, PackageEntry* new_entry) {
211 assert(Module_lock->owned_by_self(), "should have the Module_lock");
212 Hashtable<Symbol*, mtModule>::add_entry(index, (HashtableEntry<Symbol*, mtModule>*)new_entry);
213 }
214
215 // Create package in loader's package entry table and return the entry.
216 // If entry already exists, return null. Assume Module lock was taken by caller.
217 PackageEntry* PackageEntryTable::locked_create_entry_or_null(Symbol* name, ModuleEntry* module) {
218 assert(Module_lock->owned_by_self(), "should have the Module_lock");
219 // Check if package already exists. Return NULL if it does.
220 if (lookup_only(name) != NULL) {
221 return NULL;
222 } else {
223 PackageEntry* entry = new_entry(compute_hash(name), name, module);
224 add_entry(index_for(name), entry);
225 return entry;
226 }
227 }
228
229 PackageEntry* PackageEntryTable::lookup(Symbol* name, ModuleEntry* module) {
230 MutexLocker ml(Module_lock);
231 PackageEntry* p = lookup_only(name);
232 if (p != NULL) {
233 return p;
234 } else {
235 assert(module != NULL, "module should never be null");
236 PackageEntry* entry = new_entry(compute_hash(name), name, module);
237 add_entry(index_for(name), entry);
238 return entry;
239 }
240 }
241
242 PackageEntry* PackageEntryTable::lookup_only(Symbol* name) {
243 MutexLockerEx ml(Module_lock->owned_by_self() ? NULL : Module_lock);
244 int index = index_for(name);
245 for (PackageEntry* p = bucket(index); p != NULL; p = p->next()) {
246 if (p->name()->fast_compare(name) == 0) {
247 return p;
248 }
249 }
250 return NULL;
251 }
252
253 // Called when a define module for java.base is being processed.
254 // Verify the packages loaded thus far are in java.base's package list.
255 void PackageEntryTable::verify_javabase_packages(GrowableArray<Symbol*> *pkg_list) {
256 assert_lock_strong(Module_lock);
257 for (int i = 0; i < table_size(); i++) {
258 for (PackageEntry* entry = bucket(i);
259 entry != NULL;
260 entry = entry->next()) {
261 ModuleEntry* m = entry->module();
262 Symbol* module_name = (m == NULL ? NULL : m->name());
263 if (module_name != NULL &&
269 }
270 }
271
272 }
273
274 // iteration of qualified exports
275 void PackageEntry::package_exports_do(ModuleClosure* f) {
276 assert_locked_or_safepoint(Module_lock);
277 assert(f != NULL, "invariant");
278
279 if (has_qual_exports_list()) {
280 int qe_len = _qualified_exports->length();
281
282 for (int i = 0; i < qe_len; ++i) {
283 f->do_module(_qualified_exports->at(i));
284 }
285 }
286 }
287
288 bool PackageEntry::exported_pending_delete() const {
289 assert_locked_or_safepoint(Module_lock);
290 return (is_unqual_exported() && _qualified_exports != NULL);
291 }
292
293 // Remove dead entries from all packages' exported list
294 void PackageEntryTable::purge_all_package_exports() {
295 assert_locked_or_safepoint(Module_lock);
296 for (int i = 0; i < table_size(); i++) {
297 for (PackageEntry* entry = bucket(i);
298 entry != NULL;
299 entry = entry->next()) {
300 if (entry->exported_pending_delete()) {
301 // exported list is pending deletion due to a transition
302 // from qualified to unqualified
303 entry->delete_qualified_exports();
304 } else if (entry->is_qual_exported()) {
305 entry->purge_qualified_exports();
306 }
307 }
308 }
309 }
|