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.
45bool Dictionary::_some_dictionary_needs_resizing = false;
46
47Dictionary::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
53Dictionary::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
60Dictionary::~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
73DictionaryEntry* 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
81void 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
96const int _resize_load_trigger = 5; // load factor that will trigger the resize
97const double _resize_factor = 2.0; // by how much we will resize using current number of entries
98const int _resize_max_size = 40423; // the max dictionary size allowed
99const int _primelist[] = {107, 1009, 2017, 4049, 5051, 10103, 20201, _resize_max_size};
100const int _prime_array_size = sizeof(_primelist)/sizeof(int);
101
102// Calculate next "good" dictionary size based on requested count
103static 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
115bool Dictionary::does_any_dictionary_needs_resizing() {
116 return Dictionary::_some_dictionary_needs_resizing;
117}
118
119void 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
128bool 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
151bool 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
188void 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
207void 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
222void 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
236void 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.
248void 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
267void 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.
289DictionaryEntry* 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
302InstanceKlass* 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
315InstanceKlass* 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
325void 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
347bool 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.
357void 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
405SymbolPropertyTable::SymbolPropertyTable(int table_size)
406 : Hashtable<Symbol*, mtSymbol>(table_size, sizeof(SymbolPropertyEntry))
407{
408}
409SymbolPropertyTable::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
416SymbolPropertyEntry* 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
429SymbolPropertyEntry* 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
440void 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
450void 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
461void 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
470void 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
483void 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
512void 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
520void 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