loaderConstraints.hpp revision 1879:f95d63e2154a
11590Srgrimes/* 21590Srgrimes * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. 31590Srgrimes * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 41590Srgrimes * 51590Srgrimes * This code is free software; you can redistribute it and/or modify it 61590Srgrimes * under the terms of the GNU General Public License version 2 only, as 71590Srgrimes * published by the Free Software Foundation. 81590Srgrimes * 91590Srgrimes * This code is distributed in the hope that it will be useful, but WITHOUT 101590Srgrimes * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 111590Srgrimes * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 121590Srgrimes * version 2 for more details (a copy is included in the LICENSE file that 131590Srgrimes * accompanied this code). 141590Srgrimes * 151590Srgrimes * You should have received a copy of the GNU General Public License version 161590Srgrimes * 2 along with this work; if not, write to the Free Software Foundation, 171590Srgrimes * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 181590Srgrimes * 191590Srgrimes * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 201590Srgrimes * or visit www.oracle.com if you need additional information or have any 211590Srgrimes * questions. 221590Srgrimes * 231590Srgrimes */ 241590Srgrimes 251590Srgrimes#ifndef SHARE_VM_CLASSFILE_LOADERCONSTRAINTS_HPP 261590Srgrimes#define SHARE_VM_CLASSFILE_LOADERCONSTRAINTS_HPP 271590Srgrimes 281590Srgrimes#include "classfile/dictionary.hpp" 291590Srgrimes#include "classfile/placeholders.hpp" 301590Srgrimes#include "utilities/hashtable.hpp" 3141568Sarchie 321590Srgrimesclass LoaderConstraintEntry; 331590Srgrimes 3487241Smarkmclass LoaderConstraintTable : public Hashtable { 351590Srgrimes friend class VMStructs; 3687628Sdwmaloneprivate: 371590Srgrimes 3887628Sdwmalone enum Constants { 3987241Smarkm _loader_constraint_size = 107, // number of entries in constraint table 4087628Sdwmalone _nof_buckets = 1009 // number of buckets in hash table 411590Srgrimes }; 4287628Sdwmalone 4387628Sdwmalone LoaderConstraintEntry** find_loader_constraint(symbolHandle name, 4487628Sdwmalone Handle loader); 451590Srgrimes 461590Srgrimespublic: 471590Srgrimes 481590Srgrimes LoaderConstraintTable(int nof_buckets); 49149388Sbrian 501590Srgrimes LoaderConstraintEntry* new_entry(unsigned int hash, symbolOop name, 511590Srgrimes klassOop klass, int num_loaders, 521590Srgrimes int max_loaders); 531590Srgrimes 541590Srgrimes LoaderConstraintEntry* bucket(int i) { 551590Srgrimes return (LoaderConstraintEntry*)Hashtable::bucket(i); 561590Srgrimes } 571590Srgrimes 5863157Sbrian LoaderConstraintEntry** bucket_addr(int i) { 591590Srgrimes return (LoaderConstraintEntry**)Hashtable::bucket_addr(i); 6092920Simp } 611590Srgrimes 621590Srgrimes // GC support 63100815Sdwmalone void oops_do(OopClosure* f); 641590Srgrimes void always_strong_classes_do(OopClosure* blk); 651590Srgrimes 661590Srgrimes // Check class loader constraints 67149388Sbrian bool add_entry(symbolHandle name, klassOop klass1, Handle loader1, 6886099Sdwmalone klassOop klass2, Handle loader2); 691590Srgrimes 70149388Sbrian // Note: The main entry point for this module is via SystemDictionary. 71149388Sbrian // SystemDictionary::check_signature_loaders(symbolHandle signature, 721590Srgrimes // Handle loader1, Handle loader2, 73149388Sbrian // bool is_method, TRAPS) 74149388Sbrian 75149388Sbrian klassOop find_constrained_klass(symbolHandle name, Handle loader); 761590Srgrimes 771590Srgrimes // Class loader constraints 781590Srgrimes 791590Srgrimes void ensure_loader_constraint_capacity(LoaderConstraintEntry *p, int nfree); 801590Srgrimes void extend_loader_constraint(LoaderConstraintEntry* p, Handle loader, 8163157Sbrian klassOop klass); 821590Srgrimes void merge_loader_constraints(LoaderConstraintEntry** pp1, 8360583Sphk LoaderConstraintEntry** pp2, klassOop klass); 8460583Sphk 8560583Sphk bool check_or_update(instanceKlassHandle k, Handle loader, 8660583Sphk symbolHandle name); 8763157Sbrian 8863157Sbrian 8963157Sbrian void purge_loader_constraints(BoolObjectClosure* is_alive); 901590Srgrimes 911590Srgrimes void verify(Dictionary* dictionary, PlaceholderTable* placeholders); 921590Srgrimes#ifndef PRODUCT 931590Srgrimes void print(); 941590Srgrimes#endif 951590Srgrimes}; 961590Srgrimes 971590Srgrimesclass LoaderConstraintEntry : public HashtableEntry { 9863157Sbrian friend class VMStructs; 991590Srgrimesprivate: 1001590Srgrimes symbolOop _name; // class name 1011590Srgrimes int _num_loaders; 1021590Srgrimes int _max_loaders; 1031590Srgrimes oop* _loaders; // initiating loaders 1041590Srgrimes 1051590Srgrimespublic: 1061590Srgrimes 1071590Srgrimes klassOop klass() { return (klassOop)literal(); } 1081590Srgrimes klassOop* klass_addr() { return (klassOop*)literal_addr(); } 1091590Srgrimes void set_klass(klassOop k) { set_literal(k); } 110149388Sbrian 1112149Sjkh LoaderConstraintEntry* next() { 1122149Sjkh return (LoaderConstraintEntry*)HashtableEntry::next(); 1132149Sjkh } 11497984Stjr 1152149Sjkh LoaderConstraintEntry** next_addr() { 1161590Srgrimes return (LoaderConstraintEntry**)HashtableEntry::next_addr(); 1171590Srgrimes } 1181590Srgrimes void set_next(LoaderConstraintEntry* next) { 1191590Srgrimes HashtableEntry::set_next(next); 1201590Srgrimes } 1211590Srgrimes 1221590Srgrimes symbolOop name() { return _name; } 1231590Srgrimes symbolOop* name_addr() { return &_name; } 124149388Sbrian void set_name(symbolOop name) { _name = name; } 1252149Sjkh 1262149Sjkh int num_loaders() { return _num_loaders; } 1272149Sjkh void set_num_loaders(int i) { _num_loaders = i; } 12897984Stjr 1292149Sjkh int max_loaders() { return _max_loaders; } 1301590Srgrimes void set_max_loaders(int i) { _max_loaders = i; } 13128421Sjlemon 13228421Sjlemon oop* loaders() { return _loaders; } 1331590Srgrimes void set_loaders(oop* loaders) { _loaders = loaders; } 134149388Sbrian 135149388Sbrian oop loader(int i) { return _loaders[i]; } 136149388Sbrian oop* loader_addr(int i) { return &_loaders[i]; } 137149388Sbrian void set_loader(int i, oop p) { _loaders[i] = p; } 138149388Sbrian 139149388Sbrian}; 140149388Sbrian 141149388Sbrian#endif // SHARE_VM_CLASSFILE_LOADERCONSTRAINTS_HPP 142149388Sbrian