40 41 42 LoaderConstraintEntry* LoaderConstraintTable::new_entry( 43 unsigned int hash, Symbol* name, 44 Klass* klass, int num_loaders, 45 int max_loaders) { 46 LoaderConstraintEntry* entry; 47 entry = (LoaderConstraintEntry*)Hashtable<Klass*, mtClass>::new_entry(hash, klass); 48 entry->set_name(name); 49 entry->set_num_loaders(num_loaders); 50 entry->set_max_loaders(max_loaders); 51 return entry; 52 } 53 54 void LoaderConstraintTable::free_entry(LoaderConstraintEntry *entry) { 55 // decrement name refcount before freeing 56 entry->name()->decrement_refcount(); 57 Hashtable<Klass*, mtClass>::free_entry(entry); 58 } 59 60 // Enhanced Class Redefinition support 61 void LoaderConstraintTable::classes_do(KlassClosure* f) { 62 for (int index = 0; index < table_size(); index++) { 63 for (LoaderConstraintEntry* probe = bucket(index); 64 probe != NULL; 65 probe = probe->next()) { 66 if (probe->klass() != NULL) { 67 f->do_klass(probe->klass()); 68 } 69 } 70 } 71 } 72 73 // The loaderConstraintTable must always be accessed with the 74 // SystemDictionary lock held. This is true even for readers as 75 // entries in the table could be being dynamically resized. 76 77 LoaderConstraintEntry** LoaderConstraintTable::find_loader_constraint( 78 Symbol* name, Handle loader) { 79 80 unsigned int hash = compute_hash(name); 81 int index = hash_to_index(hash); 82 LoaderConstraintEntry** pp = bucket_addr(index); 83 ClassLoaderData* loader_data = ClassLoaderData::class_loader_data(loader()); 84 85 while (*pp) { 86 LoaderConstraintEntry* p = *pp; 87 if (p->hash() == hash) { 88 if (p->name() == name) { 89 for (int i = p->num_loaders() - 1; i >= 0; i--) { 90 if (p->loader_data(i) == loader_data) { 91 return pp; 92 } | 40 41 42 LoaderConstraintEntry* LoaderConstraintTable::new_entry( 43 unsigned int hash, Symbol* name, 44 Klass* klass, int num_loaders, 45 int max_loaders) { 46 LoaderConstraintEntry* entry; 47 entry = (LoaderConstraintEntry*)Hashtable<Klass*, mtClass>::new_entry(hash, klass); 48 entry->set_name(name); 49 entry->set_num_loaders(num_loaders); 50 entry->set_max_loaders(max_loaders); 51 return entry; 52 } 53 54 void LoaderConstraintTable::free_entry(LoaderConstraintEntry *entry) { 55 // decrement name refcount before freeing 56 entry->name()->decrement_refcount(); 57 Hashtable<Klass*, mtClass>::free_entry(entry); 58 } 59 60 // The loaderConstraintTable must always be accessed with the 61 // SystemDictionary lock held. This is true even for readers as 62 // entries in the table could be being dynamically resized. 63 64 LoaderConstraintEntry** LoaderConstraintTable::find_loader_constraint( 65 Symbol* name, Handle loader) { 66 67 unsigned int hash = compute_hash(name); 68 int index = hash_to_index(hash); 69 LoaderConstraintEntry** pp = bucket_addr(index); 70 ClassLoaderData* loader_data = ClassLoaderData::class_loader_data(loader()); 71 72 while (*pp) { 73 LoaderConstraintEntry* p = *pp; 74 if (p->hash() == hash) { 75 if (p->name() == name) { 76 for (int i = p->num_loaders() - 1; i >= 0; i--) { 77 if (p->loader_data(i) == loader_data) { 78 return pp; 79 } |