1 | /* |
2 | * Copyright (c) 2003, 2019, 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/classLoaderData.inline.hpp" |
27 | #include "classfile/dictionary.hpp" |
28 | #include "classfile/protectionDomainCache.hpp" |
29 | #include "classfile/systemDictionary.hpp" |
30 | #include "logging/log.hpp" |
31 | #include "logging/logStream.hpp" |
32 | #include "memory/iterator.hpp" |
33 | #include "memory/metaspaceClosure.hpp" |
34 | #include "memory/resourceArea.hpp" |
35 | #include "oops/oop.inline.hpp" |
36 | #include "runtime/atomic.hpp" |
37 | #include "runtime/orderAccess.hpp" |
38 | #include "runtime/mutexLocker.hpp" |
39 | #include "runtime/safepointVerifiers.hpp" |
40 | #include "utilities/hashtable.inline.hpp" |
41 | |
42 | // Optimization: if any dictionary needs resizing, we set this flag, |
43 | // so that we dont't have to walk all dictionaries to check if any actually |
44 | // needs resizing, which is costly to do at Safepoint. |
45 | bool Dictionary::_some_dictionary_needs_resizing = false; |
46 | |
47 | Dictionary::Dictionary(ClassLoaderData* loader_data, int table_size, bool resizable) |
48 | : Hashtable<InstanceKlass*, mtClass>(table_size, (int)sizeof(DictionaryEntry)), |
49 | _resizable(resizable), _needs_resizing(false), _loader_data(loader_data) { |
50 | }; |
51 | |
52 | |
53 | Dictionary::Dictionary(ClassLoaderData* loader_data, |
54 | int table_size, HashtableBucket<mtClass>* t, |
55 | int number_of_entries, bool resizable) |
56 | : Hashtable<InstanceKlass*, mtClass>(table_size, (int)sizeof(DictionaryEntry), t, number_of_entries), |
57 | _resizable(resizable), _needs_resizing(false), _loader_data(loader_data) { |
58 | }; |
59 | |
60 | Dictionary::~Dictionary() { |
61 | DictionaryEntry* probe = NULL; |
62 | for (int index = 0; index < table_size(); index++) { |
63 | for (DictionaryEntry** p = bucket_addr(index); *p != NULL; ) { |
64 | probe = *p; |
65 | *p = probe->next(); |
66 | free_entry(probe); |
67 | } |
68 | } |
69 | assert(number_of_entries() == 0, "should have removed all entries" ); |
70 | assert(new_entry_free_list() == NULL, "entry present on Dictionary's free list" ); |
71 | } |
72 | |
73 | DictionaryEntry* Dictionary::new_entry(unsigned int hash, InstanceKlass* klass) { |
74 | DictionaryEntry* entry = (DictionaryEntry*)Hashtable<InstanceKlass*, mtClass>::allocate_new_entry(hash, klass); |
75 | entry->set_pd_set(NULL); |
76 | assert(klass->is_instance_klass(), "Must be" ); |
77 | return entry; |
78 | } |
79 | |
80 | |
81 | void Dictionary::free_entry(DictionaryEntry* entry) { |
82 | // avoid recursion when deleting linked list |
83 | // pd_set is accessed during a safepoint. |
84 | // This doesn't require a lock because nothing is reading this |
85 | // entry anymore. The ClassLoader is dead. |
86 | while (entry->pd_set() != NULL) { |
87 | ProtectionDomainEntry* to_delete = entry->pd_set(); |
88 | entry->set_pd_set(to_delete->next()); |
89 | delete to_delete; |
90 | } |
91 | // Unlink from the Hashtable prior to freeing |
92 | unlink_entry(entry); |
93 | FREE_C_HEAP_ARRAY(char, entry); |
94 | } |
95 | |
96 | const int _resize_load_trigger = 5; // load factor that will trigger the resize |
97 | const double _resize_factor = 2.0; // by how much we will resize using current number of entries |
98 | const int _resize_max_size = 40423; // the max dictionary size allowed |
99 | const int _primelist[] = {107, 1009, 2017, 4049, 5051, 10103, 20201, _resize_max_size}; |
100 | const int _prime_array_size = sizeof(_primelist)/sizeof(int); |
101 | |
102 | // Calculate next "good" dictionary size based on requested count |
103 | static int calculate_dictionary_size(int requested) { |
104 | int newsize = _primelist[0]; |
105 | int index = 0; |
106 | for (newsize = _primelist[index]; index < (_prime_array_size - 1); |
107 | newsize = _primelist[++index]) { |
108 | if (requested <= newsize) { |
109 | break; |
110 | } |
111 | } |
112 | return newsize; |
113 | } |
114 | |
115 | bool Dictionary::does_any_dictionary_needs_resizing() { |
116 | return Dictionary::_some_dictionary_needs_resizing; |
117 | } |
118 | |
119 | void Dictionary::check_if_needs_resize() { |
120 | if (_resizable == true) { |
121 | if (number_of_entries() > (_resize_load_trigger*table_size())) { |
122 | _needs_resizing = true; |
123 | Dictionary::_some_dictionary_needs_resizing = true; |
124 | } |
125 | } |
126 | } |
127 | |
128 | bool Dictionary::resize_if_needed() { |
129 | int desired_size = 0; |
130 | if (_needs_resizing == true) { |
131 | desired_size = calculate_dictionary_size((int)(_resize_factor*number_of_entries())); |
132 | if (desired_size >= _resize_max_size) { |
133 | desired_size = _resize_max_size; |
134 | // We have reached the limit, turn resizing off |
135 | _resizable = false; |
136 | } |
137 | if ((desired_size != 0) && (desired_size != table_size())) { |
138 | if (!resize(desired_size)) { |
139 | // Something went wrong, turn resizing off |
140 | _resizable = false; |
141 | } |
142 | } |
143 | } |
144 | |
145 | _needs_resizing = false; |
146 | Dictionary::_some_dictionary_needs_resizing = false; |
147 | |
148 | return (desired_size != 0); |
149 | } |
150 | |
151 | bool DictionaryEntry::contains_protection_domain(oop protection_domain) const { |
152 | // Lock the pd_set list. This lock cannot safepoint since the caller holds |
153 | // a Dictionary entry, which can be moved if the Dictionary is resized. |
154 | MutexLocker ml(ProtectionDomainSet_lock, Mutex::_no_safepoint_check_flag); |
155 | #ifdef ASSERT |
156 | if (oopDesc::equals(protection_domain, instance_klass()->protection_domain())) { |
157 | // Ensure this doesn't show up in the pd_set (invariant) |
158 | bool in_pd_set = false; |
159 | for (ProtectionDomainEntry* current = pd_set(); |
160 | current != NULL; |
161 | current = current->next()) { |
162 | if (oopDesc::equals(current->object_no_keepalive(), protection_domain)) { |
163 | in_pd_set = true; |
164 | break; |
165 | } |
166 | } |
167 | if (in_pd_set) { |
168 | assert(false, "A klass's protection domain should not show up " |
169 | "in its sys. dict. PD set" ); |
170 | } |
171 | } |
172 | #endif /* ASSERT */ |
173 | |
174 | if (oopDesc::equals(protection_domain, instance_klass()->protection_domain())) { |
175 | // Succeeds trivially |
176 | return true; |
177 | } |
178 | |
179 | for (ProtectionDomainEntry* current = pd_set(); |
180 | current != NULL; |
181 | current = current->next()) { |
182 | if (oopDesc::equals(current->object_no_keepalive(), protection_domain)) return true; |
183 | } |
184 | return false; |
185 | } |
186 | |
187 | |
188 | void DictionaryEntry::add_protection_domain(Dictionary* dict, Handle protection_domain) { |
189 | assert_locked_or_safepoint(SystemDictionary_lock); |
190 | if (!contains_protection_domain(protection_domain())) { |
191 | ProtectionDomainCacheEntry* entry = SystemDictionary::cache_get(protection_domain); |
192 | // The pd_set in the dictionary entry is protected by a low level lock. |
193 | // With concurrent PD table cleanup, these links could be broken. |
194 | MutexLocker ml(ProtectionDomainSet_lock, Mutex::_no_safepoint_check_flag); |
195 | ProtectionDomainEntry* new_head = |
196 | new ProtectionDomainEntry(entry, pd_set()); |
197 | set_pd_set(new_head); |
198 | } |
199 | LogTarget(Trace, protectiondomain) lt; |
200 | if (lt.is_enabled()) { |
201 | LogStream ls(lt); |
202 | print_count(&ls); |
203 | } |
204 | } |
205 | |
206 | // Just the classes from defining class loaders |
207 | void Dictionary::classes_do(void f(InstanceKlass*)) { |
208 | for (int index = 0; index < table_size(); index++) { |
209 | for (DictionaryEntry* probe = bucket(index); |
210 | probe != NULL; |
211 | probe = probe->next()) { |
212 | InstanceKlass* k = probe->instance_klass(); |
213 | if (loader_data() == k->class_loader_data()) { |
214 | f(k); |
215 | } |
216 | } |
217 | } |
218 | } |
219 | |
220 | // Added for initialize_itable_for_klass to handle exceptions |
221 | // Just the classes from defining class loaders |
222 | void Dictionary::classes_do(void f(InstanceKlass*, TRAPS), TRAPS) { |
223 | for (int index = 0; index < table_size(); index++) { |
224 | for (DictionaryEntry* probe = bucket(index); |
225 | probe != NULL; |
226 | probe = probe->next()) { |
227 | InstanceKlass* k = probe->instance_klass(); |
228 | if (loader_data() == k->class_loader_data()) { |
229 | f(k, CHECK); |
230 | } |
231 | } |
232 | } |
233 | } |
234 | |
235 | // All classes, and their class loaders, including initiating class loaders |
236 | void Dictionary::all_entries_do(KlassClosure* closure) { |
237 | for (int index = 0; index < table_size(); index++) { |
238 | for (DictionaryEntry* probe = bucket(index); |
239 | probe != NULL; |
240 | probe = probe->next()) { |
241 | InstanceKlass* k = probe->instance_klass(); |
242 | closure->do_klass(k); |
243 | } |
244 | } |
245 | } |
246 | |
247 | // Used to scan and relocate the classes during CDS archive dump. |
248 | void Dictionary::classes_do(MetaspaceClosure* it) { |
249 | assert(DumpSharedSpaces || DynamicDumpSharedSpaces, "dump-time only" ); |
250 | for (int index = 0; index < table_size(); index++) { |
251 | for (DictionaryEntry* probe = bucket(index); |
252 | probe != NULL; |
253 | probe = probe->next()) { |
254 | it->push(probe->klass_addr()); |
255 | } |
256 | } |
257 | } |
258 | |
259 | |
260 | |
261 | // Add a loaded class to the dictionary. |
262 | // Readers of the SystemDictionary aren't always locked, so _buckets |
263 | // is volatile. The store of the next field in the constructor is |
264 | // also cast to volatile; we do this to ensure store order is maintained |
265 | // by the compilers. |
266 | |
267 | void Dictionary::add_klass(unsigned int hash, Symbol* class_name, |
268 | InstanceKlass* obj) { |
269 | assert_locked_or_safepoint(SystemDictionary_lock); |
270 | assert(obj != NULL, "adding NULL obj" ); |
271 | assert(obj->name() == class_name, "sanity check on name" ); |
272 | |
273 | DictionaryEntry* entry = new_entry(hash, obj); |
274 | int index = hash_to_index(hash); |
275 | add_entry(index, entry); |
276 | check_if_needs_resize(); |
277 | } |
278 | |
279 | |
280 | // This routine does not lock the dictionary. |
281 | // |
282 | // Since readers don't hold a lock, we must make sure that system |
283 | // dictionary entries are only removed at a safepoint (when only one |
284 | // thread is running), and are added to in a safe way (all links must |
285 | // be updated in an MT-safe manner). |
286 | // |
287 | // Callers should be aware that an entry could be added just after |
288 | // _buckets[index] is read here, so the caller will not see the new entry. |
289 | DictionaryEntry* Dictionary::get_entry(int index, unsigned int hash, |
290 | Symbol* class_name) { |
291 | for (DictionaryEntry* entry = bucket(index); |
292 | entry != NULL; |
293 | entry = entry->next()) { |
294 | if (entry->hash() == hash && entry->equals(class_name)) { |
295 | return entry; |
296 | } |
297 | } |
298 | return NULL; |
299 | } |
300 | |
301 | |
302 | InstanceKlass* Dictionary::find(unsigned int hash, Symbol* name, |
303 | Handle protection_domain) { |
304 | NoSafepointVerifier nsv; |
305 | |
306 | int index = hash_to_index(hash); |
307 | DictionaryEntry* entry = get_entry(index, hash, name); |
308 | if (entry != NULL && entry->is_valid_protection_domain(protection_domain)) { |
309 | return entry->instance_klass(); |
310 | } else { |
311 | return NULL; |
312 | } |
313 | } |
314 | |
315 | InstanceKlass* Dictionary::find_class(int index, unsigned int hash, |
316 | Symbol* name) { |
317 | assert_locked_or_safepoint(SystemDictionary_lock); |
318 | assert (index == index_for(name), "incorrect index?" ); |
319 | |
320 | DictionaryEntry* entry = get_entry(index, hash, name); |
321 | return (entry != NULL) ? entry->instance_klass() : NULL; |
322 | } |
323 | |
324 | |
325 | void Dictionary::add_protection_domain(int index, unsigned int hash, |
326 | InstanceKlass* klass, |
327 | Handle protection_domain, |
328 | TRAPS) { |
329 | Symbol* klass_name = klass->name(); |
330 | DictionaryEntry* entry = get_entry(index, hash, klass_name); |
331 | |
332 | assert(entry != NULL,"entry must be present, we just created it" ); |
333 | assert(protection_domain() != NULL, |
334 | "real protection domain should be present" ); |
335 | |
336 | entry->add_protection_domain(this, protection_domain); |
337 | |
338 | #ifdef ASSERT |
339 | assert(loader_data() != ClassLoaderData::the_null_class_loader_data(), "doesn't make sense" ); |
340 | #endif |
341 | |
342 | assert(entry->contains_protection_domain(protection_domain()), |
343 | "now protection domain should be present" ); |
344 | } |
345 | |
346 | |
347 | bool Dictionary::is_valid_protection_domain(unsigned int hash, |
348 | Symbol* name, |
349 | Handle protection_domain) { |
350 | int index = hash_to_index(hash); |
351 | DictionaryEntry* entry = get_entry(index, hash, name); |
352 | return entry->is_valid_protection_domain(protection_domain); |
353 | } |
354 | |
355 | // During class loading we may have cached a protection domain that has |
356 | // since been unreferenced, so this entry should be cleared. |
357 | void Dictionary::clean_cached_protection_domains() { |
358 | assert_locked_or_safepoint(SystemDictionary_lock); |
359 | |
360 | if (loader_data()->is_the_null_class_loader_data()) { |
361 | // Classes in the boot loader are not loaded with protection domains |
362 | return; |
363 | } |
364 | |
365 | for (int index = 0; index < table_size(); index++) { |
366 | for (DictionaryEntry* probe = bucket(index); |
367 | probe != NULL; |
368 | probe = probe->next()) { |
369 | Klass* e = probe->instance_klass(); |
370 | |
371 | MutexLocker ml(ProtectionDomainSet_lock, Mutex::_no_safepoint_check_flag); |
372 | ProtectionDomainEntry* current = probe->pd_set(); |
373 | ProtectionDomainEntry* prev = NULL; |
374 | while (current != NULL) { |
375 | if (current->object_no_keepalive() == NULL) { |
376 | LogTarget(Debug, protectiondomain) lt; |
377 | if (lt.is_enabled()) { |
378 | ResourceMark rm; |
379 | // Print out trace information |
380 | LogStream ls(lt); |
381 | ls.print_cr("PD in set is not alive:" ); |
382 | ls.print("class loader: " ); loader_data()->class_loader()->print_value_on(&ls); |
383 | ls.print(" loading: " ); probe->instance_klass()->print_value_on(&ls); |
384 | ls.cr(); |
385 | } |
386 | if (probe->pd_set() == current) { |
387 | probe->set_pd_set(current->next()); |
388 | } else { |
389 | assert(prev != NULL, "should be set by alive entry" ); |
390 | prev->set_next(current->next()); |
391 | } |
392 | ProtectionDomainEntry* to_delete = current; |
393 | current = current->next(); |
394 | delete to_delete; |
395 | } else { |
396 | prev = current; |
397 | current = current->next(); |
398 | } |
399 | } |
400 | } |
401 | } |
402 | } |
403 | |
404 | |
405 | SymbolPropertyTable::SymbolPropertyTable(int table_size) |
406 | : Hashtable<Symbol*, mtSymbol>(table_size, sizeof(SymbolPropertyEntry)) |
407 | { |
408 | } |
409 | SymbolPropertyTable::SymbolPropertyTable(int table_size, HashtableBucket<mtSymbol>* t, |
410 | int number_of_entries) |
411 | : Hashtable<Symbol*, mtSymbol>(table_size, sizeof(SymbolPropertyEntry), t, number_of_entries) |
412 | { |
413 | } |
414 | |
415 | |
416 | SymbolPropertyEntry* SymbolPropertyTable::find_entry(int index, unsigned int hash, |
417 | Symbol* sym, |
418 | intptr_t sym_mode) { |
419 | assert(index == index_for(sym, sym_mode), "incorrect index?" ); |
420 | for (SymbolPropertyEntry* p = bucket(index); p != NULL; p = p->next()) { |
421 | if (p->hash() == hash && p->symbol() == sym && p->symbol_mode() == sym_mode) { |
422 | return p; |
423 | } |
424 | } |
425 | return NULL; |
426 | } |
427 | |
428 | |
429 | SymbolPropertyEntry* SymbolPropertyTable::add_entry(int index, unsigned int hash, |
430 | Symbol* sym, intptr_t sym_mode) { |
431 | assert_locked_or_safepoint(SystemDictionary_lock); |
432 | assert(index == index_for(sym, sym_mode), "incorrect index?" ); |
433 | assert(find_entry(index, hash, sym, sym_mode) == NULL, "no double entry" ); |
434 | |
435 | SymbolPropertyEntry* p = new_entry(hash, sym, sym_mode); |
436 | Hashtable<Symbol*, mtSymbol>::add_entry(index, p); |
437 | return p; |
438 | } |
439 | |
440 | void SymbolPropertyTable::oops_do(OopClosure* f) { |
441 | for (int index = 0; index < table_size(); index++) { |
442 | for (SymbolPropertyEntry* p = bucket(index); p != NULL; p = p->next()) { |
443 | if (p->method_type() != NULL) { |
444 | f->do_oop(p->method_type_addr()); |
445 | } |
446 | } |
447 | } |
448 | } |
449 | |
450 | void SymbolPropertyTable::methods_do(void f(Method*)) { |
451 | for (int index = 0; index < table_size(); index++) { |
452 | for (SymbolPropertyEntry* p = bucket(index); p != NULL; p = p->next()) { |
453 | Method* prop = p->method(); |
454 | if (prop != NULL) { |
455 | f((Method*)prop); |
456 | } |
457 | } |
458 | } |
459 | } |
460 | |
461 | void DictionaryEntry::verify_protection_domain_set() { |
462 | MutexLocker ml(ProtectionDomainSet_lock, Mutex::_no_safepoint_check_flag); |
463 | for (ProtectionDomainEntry* current = pd_set(); // accessed at a safepoint |
464 | current != NULL; |
465 | current = current->_next) { |
466 | guarantee(oopDesc::is_oop_or_null(current->_pd_cache->object_no_keepalive()), "Invalid oop" ); |
467 | } |
468 | } |
469 | |
470 | void DictionaryEntry::print_count(outputStream *st) { |
471 | MutexLocker ml(ProtectionDomainSet_lock, Mutex::_no_safepoint_check_flag); |
472 | int count = 0; |
473 | for (ProtectionDomainEntry* current = pd_set(); // accessed inside SD lock |
474 | current != NULL; |
475 | current = current->_next) { |
476 | count++; |
477 | } |
478 | st->print_cr("pd set count = #%d" , count); |
479 | } |
480 | |
481 | // ---------------------------------------------------------------------------- |
482 | |
483 | void Dictionary::print_on(outputStream* st) const { |
484 | ResourceMark rm; |
485 | |
486 | assert(loader_data() != NULL, "loader data should not be null" ); |
487 | st->print_cr("Java dictionary (table_size=%d, classes=%d, resizable=%s)" , |
488 | table_size(), number_of_entries(), BOOL_TO_STR(_resizable)); |
489 | st->print_cr("^ indicates that initiating loader is different from defining loader" ); |
490 | |
491 | for (int index = 0; index < table_size(); index++) { |
492 | for (DictionaryEntry* probe = bucket(index); |
493 | probe != NULL; |
494 | probe = probe->next()) { |
495 | Klass* e = probe->instance_klass(); |
496 | bool is_defining_class = |
497 | (loader_data() == e->class_loader_data()); |
498 | st->print("%4d: %s%s" , index, is_defining_class ? " " : "^" , e->external_name()); |
499 | ClassLoaderData* cld = e->class_loader_data(); |
500 | if (!loader_data()->is_the_null_class_loader_data()) { |
501 | // Class loader output for the dictionary for the null class loader data is |
502 | // redundant and obvious. |
503 | st->print(", " ); |
504 | cld->print_value_on(st); |
505 | } |
506 | st->cr(); |
507 | } |
508 | } |
509 | tty->cr(); |
510 | } |
511 | |
512 | void DictionaryEntry::verify() { |
513 | Klass* e = instance_klass(); |
514 | guarantee(e->is_instance_klass(), |
515 | "Verify of dictionary failed" ); |
516 | e->verify(); |
517 | verify_protection_domain_set(); |
518 | } |
519 | |
520 | void Dictionary::verify() { |
521 | guarantee(number_of_entries() >= 0, "Verify of dictionary failed" ); |
522 | |
523 | ClassLoaderData* cld = loader_data(); |
524 | // class loader must be present; a null class loader is the |
525 | // boostrap loader |
526 | guarantee(cld != NULL || |
527 | cld->class_loader() == NULL || |
528 | cld->class_loader()->is_instance(), |
529 | "checking type of class_loader" ); |
530 | |
531 | ResourceMark rm; |
532 | stringStream tempst; |
533 | tempst.print("System Dictionary for %s class loader" , cld->loader_name_and_id()); |
534 | verify_table<DictionaryEntry>(tempst.as_string()); |
535 | } |
536 | |