< prev index next >

src/share/vm/classfile/loaderConstraints.cpp

Print this page




  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           }


< prev index next >