duke@435: /* jrose@1100: * Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved. duke@435: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@435: * duke@435: * This code is free software; you can redistribute it and/or modify it duke@435: * under the terms of the GNU General Public License version 2 only, as duke@435: * published by the Free Software Foundation. duke@435: * duke@435: * This code is distributed in the hope that it will be useful, but WITHOUT duke@435: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@435: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@435: * version 2 for more details (a copy is included in the LICENSE file that duke@435: * accompanied this code). duke@435: * duke@435: * You should have received a copy of the GNU General Public License version duke@435: * 2 along with this work; if not, write to the Free Software Foundation, duke@435: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@435: * duke@435: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, duke@435: * CA 95054 USA or visit www.sun.com if you need additional information or duke@435: * have any questions. duke@435: * duke@435: */ duke@435: duke@435: class LoaderConstraintEntry; duke@435: duke@435: class LoaderConstraintTable : public Hashtable { duke@435: friend class VMStructs; duke@435: private: duke@435: duke@435: enum Constants { duke@435: _loader_constraint_size = 107, // number of entries in constraint table duke@435: _nof_buckets = 1009 // number of buckets in hash table duke@435: }; duke@435: duke@435: LoaderConstraintEntry** find_loader_constraint(symbolHandle name, duke@435: Handle loader); duke@435: duke@435: public: duke@435: duke@435: LoaderConstraintTable(int nof_buckets); duke@435: duke@435: LoaderConstraintEntry* new_entry(unsigned int hash, symbolOop name, duke@435: klassOop klass, int num_loaders, duke@435: int max_loaders); duke@435: duke@435: LoaderConstraintEntry* bucket(int i) { duke@435: return (LoaderConstraintEntry*)Hashtable::bucket(i); duke@435: } duke@435: duke@435: LoaderConstraintEntry** bucket_addr(int i) { duke@435: return (LoaderConstraintEntry**)Hashtable::bucket_addr(i); duke@435: } duke@435: duke@435: // GC support duke@435: void oops_do(OopClosure* f); duke@435: void always_strong_classes_do(OopClosure* blk); duke@435: duke@435: // Check class loader constraints duke@435: bool add_entry(symbolHandle name, klassOop klass1, Handle loader1, duke@435: klassOop klass2, Handle loader2); duke@435: jrose@1100: // Note: The main entry point for this module is via SystemDictionary. jrose@1100: // SystemDictionary::check_signature_loaders(symbolHandle signature, jrose@1100: // Handle loader1, Handle loader2, jrose@1100: // bool is_method, TRAPS) duke@435: duke@435: klassOop find_constrained_klass(symbolHandle name, Handle loader); duke@435: klassOop find_constrained_elem_klass(symbolHandle name, symbolHandle elem_name, duke@435: Handle loader, TRAPS); duke@435: duke@435: duke@435: // Class loader constraints duke@435: duke@435: void ensure_loader_constraint_capacity(LoaderConstraintEntry *p, int nfree); duke@435: void extend_loader_constraint(LoaderConstraintEntry* p, Handle loader, duke@435: klassOop klass); duke@435: void merge_loader_constraints(LoaderConstraintEntry** pp1, duke@435: LoaderConstraintEntry** pp2, klassOop klass); duke@435: duke@435: bool check_or_update(instanceKlassHandle k, Handle loader, duke@435: symbolHandle name); duke@435: duke@435: duke@435: void purge_loader_constraints(BoolObjectClosure* is_alive); duke@435: duke@435: void verify(Dictionary* dictionary); duke@435: #ifndef PRODUCT duke@435: void print(); duke@435: #endif duke@435: }; duke@435: duke@435: class LoaderConstraintEntry : public HashtableEntry { duke@435: friend class VMStructs; duke@435: private: duke@435: symbolOop _name; // class name duke@435: int _num_loaders; duke@435: int _max_loaders; duke@435: oop* _loaders; // initiating loaders duke@435: duke@435: public: duke@435: duke@435: klassOop klass() { return (klassOop)literal(); } duke@435: klassOop* klass_addr() { return (klassOop*)literal_addr(); } duke@435: void set_klass(klassOop k) { set_literal(k); } duke@435: duke@435: LoaderConstraintEntry* next() { duke@435: return (LoaderConstraintEntry*)HashtableEntry::next(); duke@435: } duke@435: duke@435: LoaderConstraintEntry** next_addr() { duke@435: return (LoaderConstraintEntry**)HashtableEntry::next_addr(); duke@435: } duke@435: void set_next(LoaderConstraintEntry* next) { duke@435: HashtableEntry::set_next(next); duke@435: } duke@435: duke@435: symbolOop name() { return _name; } duke@435: symbolOop* name_addr() { return &_name; } duke@435: void set_name(symbolOop name) { _name = name; } duke@435: duke@435: int num_loaders() { return _num_loaders; } duke@435: void set_num_loaders(int i) { _num_loaders = i; } duke@435: duke@435: int max_loaders() { return _max_loaders; } duke@435: void set_max_loaders(int i) { _max_loaders = i; } duke@435: duke@435: oop* loaders() { return _loaders; } duke@435: void set_loaders(oop* loaders) { _loaders = loaders; } duke@435: duke@435: oop loader(int i) { return _loaders[i]; } duke@435: oop* loader_addr(int i) { return &_loaders[i]; } duke@435: void set_loader(int i, oop p) { _loaders[i] = p; } duke@435: duke@435: };