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