Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/share/vm/classfile/loaderConstraints.hpp
32285 views
/*1* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*22*/2324#ifndef SHARE_VM_CLASSFILE_LOADERCONSTRAINTS_HPP25#define SHARE_VM_CLASSFILE_LOADERCONSTRAINTS_HPP2627#include "classfile/dictionary.hpp"28#include "classfile/placeholders.hpp"29#include "utilities/hashtable.hpp"3031class LoaderConstraintEntry;32class Symbol;3334class LoaderConstraintTable : public Hashtable<Klass*, mtClass> {35friend class VMStructs;36private:3738enum Constants {39_loader_constraint_size = 107, // number of entries in constraint table40_nof_buckets = 1009 // number of buckets in hash table41};4243LoaderConstraintEntry** find_loader_constraint(Symbol* name,44Handle loader);4546public:4748LoaderConstraintTable(int nof_buckets);4950LoaderConstraintEntry* new_entry(unsigned int hash, Symbol* name,51Klass* klass, int num_loaders,52int max_loaders);53void free_entry(LoaderConstraintEntry *entry);5455LoaderConstraintEntry* bucket(int i) {56return (LoaderConstraintEntry*)Hashtable<Klass*, mtClass>::bucket(i);57}5859LoaderConstraintEntry** bucket_addr(int i) {60return (LoaderConstraintEntry**)Hashtable<Klass*, mtClass>::bucket_addr(i);61}6263// Enhanced Class Redefinition support64void classes_do(KlassClosure* f);6566// Check class loader constraints67bool add_entry(Symbol* name, Klass* klass1, Handle loader1,68Klass* klass2, Handle loader2);6970// Note: The main entry point for this module is via SystemDictionary.71// SystemDictionary::check_signature_loaders(Symbol* signature,72// Handle loader1, Handle loader2,73// bool is_method, TRAPS)7475Klass* find_constrained_klass(Symbol* name, Handle loader);7677// Class loader constraints7879void ensure_loader_constraint_capacity(LoaderConstraintEntry *p, int nfree);80void extend_loader_constraint(LoaderConstraintEntry* p, Handle loader,81Klass* klass);82void merge_loader_constraints(LoaderConstraintEntry** pp1,83LoaderConstraintEntry** pp2, Klass* klass);8485bool check_or_update(instanceKlassHandle k, Handle loader,86Symbol* name);878889void purge_loader_constraints();9091void verify(Dictionary* dictionary, PlaceholderTable* placeholders);92#ifndef PRODUCT93void print();94#endif95};9697class LoaderConstraintEntry : public HashtableEntry<Klass*, mtClass> {98friend class VMStructs;99private:100Symbol* _name; // class name101int _num_loaders;102int _max_loaders;103// Loader constraints enforce correct linking behavior.104// Thus, it really operates on ClassLoaderData which represents linking domain,105// not class loaders.106ClassLoaderData** _loaders; // initiating loaders107108public:109110Klass* klass() { return literal(); }111Klass** klass_addr() { return literal_addr(); }112void set_klass(Klass* k) { set_literal(k); }113114LoaderConstraintEntry* next() {115return (LoaderConstraintEntry*)HashtableEntry<Klass*, mtClass>::next();116}117118LoaderConstraintEntry** next_addr() {119return (LoaderConstraintEntry**)HashtableEntry<Klass*, mtClass>::next_addr();120}121void set_next(LoaderConstraintEntry* next) {122HashtableEntry<Klass*, mtClass>::set_next(next);123}124125Symbol* name() { return _name; }126void set_name(Symbol* name) {127_name = name;128if (name != NULL) name->increment_refcount();129}130131int num_loaders() { return _num_loaders; }132void set_num_loaders(int i) { _num_loaders = i; }133134int max_loaders() { return _max_loaders; }135void set_max_loaders(int i) { _max_loaders = i; }136137ClassLoaderData** loaders() { return _loaders; }138void set_loaders(ClassLoaderData** loaders) { _loaders = loaders; }139140ClassLoaderData* loader_data(int i) { return _loaders[i]; }141void set_loader_data(int i, ClassLoaderData* p) { _loaders[i] = p; }142// convenience143void set_loader(int i, oop p);144};145146#endif // SHARE_VM_CLASSFILE_LOADERCONSTRAINTS_HPP147148149