comparison src/share/vm/classfile/loaderConstraints.hpp @ 6725:da91efe96a93

6964458: Reimplement class meta-data storage to use native memory Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author coleenp
date Sat, 01 Sep 2012 13:25:18 -0400
parents d2a62e0f25eb
children
comparison
equal deleted inserted replaced
6724:36d1d483d5d6 6725:da91efe96a93
1 /* 1 /*
2 * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
28 #include "classfile/dictionary.hpp" 28 #include "classfile/dictionary.hpp"
29 #include "classfile/placeholders.hpp" 29 #include "classfile/placeholders.hpp"
30 #include "utilities/hashtable.hpp" 30 #include "utilities/hashtable.hpp"
31 31
32 class LoaderConstraintEntry; 32 class LoaderConstraintEntry;
33 class Symbol;
33 34
34 class LoaderConstraintTable : public Hashtable<klassOop, mtClass> { 35 class LoaderConstraintTable : public Hashtable<Klass*, mtClass> {
35 friend class VMStructs; 36 friend class VMStructs;
36 private: 37 private:
37 38
38 enum Constants { 39 enum Constants {
39 _loader_constraint_size = 107, // number of entries in constraint table 40 _loader_constraint_size = 107, // number of entries in constraint table
46 public: 47 public:
47 48
48 LoaderConstraintTable(int nof_buckets); 49 LoaderConstraintTable(int nof_buckets);
49 50
50 LoaderConstraintEntry* new_entry(unsigned int hash, Symbol* name, 51 LoaderConstraintEntry* new_entry(unsigned int hash, Symbol* name,
51 klassOop klass, int num_loaders, 52 Klass* klass, int num_loaders,
52 int max_loaders); 53 int max_loaders);
53 void free_entry(LoaderConstraintEntry *entry); 54 void free_entry(LoaderConstraintEntry *entry);
54 55
55 LoaderConstraintEntry* bucket(int i) { 56 LoaderConstraintEntry* bucket(int i) {
56 return (LoaderConstraintEntry*)Hashtable<klassOop, mtClass>::bucket(i); 57 return (LoaderConstraintEntry*)Hashtable<Klass*, mtClass>::bucket(i);
57 } 58 }
58 59
59 LoaderConstraintEntry** bucket_addr(int i) { 60 LoaderConstraintEntry** bucket_addr(int i) {
60 return (LoaderConstraintEntry**)Hashtable<klassOop, mtClass>::bucket_addr(i); 61 return (LoaderConstraintEntry**)Hashtable<Klass*, mtClass>::bucket_addr(i);
61 } 62 }
62 63
63 // GC support 64 // Enhanced Class Redefinition support
64 void oops_do(OopClosure* f); 65 void classes_do(KlassClosure* f);
65 66
66 // Check class loader constraints 67 // Check class loader constraints
67 bool add_entry(Symbol* name, klassOop klass1, Handle loader1, 68 bool add_entry(Symbol* name, Klass* klass1, Handle loader1,
68 klassOop klass2, Handle loader2); 69 Klass* klass2, Handle loader2);
69 70
70 // Note: The main entry point for this module is via SystemDictionary. 71 // Note: The main entry point for this module is via SystemDictionary.
71 // SystemDictionary::check_signature_loaders(Symbol* signature, 72 // SystemDictionary::check_signature_loaders(Symbol* signature,
72 // Handle loader1, Handle loader2, 73 // Handle loader1, Handle loader2,
73 // bool is_method, TRAPS) 74 // bool is_method, TRAPS)
74 75
75 klassOop find_constrained_klass(Symbol* name, Handle loader); 76 Klass* find_constrained_klass(Symbol* name, Handle loader);
76 77
77 // Class loader constraints 78 // Class loader constraints
78 79
79 void ensure_loader_constraint_capacity(LoaderConstraintEntry *p, int nfree); 80 void ensure_loader_constraint_capacity(LoaderConstraintEntry *p, int nfree);
80 void extend_loader_constraint(LoaderConstraintEntry* p, Handle loader, 81 void extend_loader_constraint(LoaderConstraintEntry* p, Handle loader,
81 klassOop klass); 82 Klass* klass);
82 void merge_loader_constraints(LoaderConstraintEntry** pp1, 83 void merge_loader_constraints(LoaderConstraintEntry** pp1,
83 LoaderConstraintEntry** pp2, klassOop klass); 84 LoaderConstraintEntry** pp2, Klass* klass);
84 85
85 bool check_or_update(instanceKlassHandle k, Handle loader, 86 bool check_or_update(instanceKlassHandle k, Handle loader,
86 Symbol* name); 87 Symbol* name);
87 88
88 89
89 void purge_loader_constraints(BoolObjectClosure* is_alive); 90 void purge_loader_constraints();
90 91
91 void verify(Dictionary* dictionary, PlaceholderTable* placeholders); 92 void verify(Dictionary* dictionary, PlaceholderTable* placeholders);
92 #ifndef PRODUCT 93 #ifndef PRODUCT
93 void print(); 94 void print();
94 #endif 95 #endif
95 }; 96 };
96 97
97 class LoaderConstraintEntry : public HashtableEntry<klassOop, mtClass> { 98 class LoaderConstraintEntry : public HashtableEntry<Klass*, mtClass> {
98 friend class VMStructs; 99 friend class VMStructs;
99 private: 100 private:
100 Symbol* _name; // class name 101 Symbol* _name; // class name
101 int _num_loaders; 102 int _num_loaders;
102 int _max_loaders; 103 int _max_loaders;
103 oop* _loaders; // initiating loaders 104 // Loader constraints enforce correct linking behavior.
105 // Thus, it really operates on ClassLoaderData which represents linking domain,
106 // not class loaders.
107 ClassLoaderData** _loaders; // initiating loaders
104 108
105 public: 109 public:
106 110
107 klassOop klass() { return literal(); } 111 Klass* klass() { return literal(); }
108 klassOop* klass_addr() { return literal_addr(); } 112 Klass** klass_addr() { return literal_addr(); }
109 void set_klass(klassOop k) { set_literal(k); } 113 void set_klass(Klass* k) { set_literal(k); }
110 114
111 LoaderConstraintEntry* next() { 115 LoaderConstraintEntry* next() {
112 return (LoaderConstraintEntry*)HashtableEntry<klassOop, mtClass>::next(); 116 return (LoaderConstraintEntry*)HashtableEntry<Klass*, mtClass>::next();
113 } 117 }
114 118
115 LoaderConstraintEntry** next_addr() { 119 LoaderConstraintEntry** next_addr() {
116 return (LoaderConstraintEntry**)HashtableEntry<klassOop, mtClass>::next_addr(); 120 return (LoaderConstraintEntry**)HashtableEntry<Klass*, mtClass>::next_addr();
117 } 121 }
118 void set_next(LoaderConstraintEntry* next) { 122 void set_next(LoaderConstraintEntry* next) {
119 HashtableEntry<klassOop, mtClass>::set_next(next); 123 HashtableEntry<Klass*, mtClass>::set_next(next);
120 } 124 }
121 125
122 Symbol* name() { return _name; } 126 Symbol* name() { return _name; }
123 void set_name(Symbol* name) { 127 void set_name(Symbol* name) {
124 _name = name; 128 _name = name;
129 void set_num_loaders(int i) { _num_loaders = i; } 133 void set_num_loaders(int i) { _num_loaders = i; }
130 134
131 int max_loaders() { return _max_loaders; } 135 int max_loaders() { return _max_loaders; }
132 void set_max_loaders(int i) { _max_loaders = i; } 136 void set_max_loaders(int i) { _max_loaders = i; }
133 137
134 oop* loaders() { return _loaders; } 138 ClassLoaderData** loaders() { return _loaders; }
135 void set_loaders(oop* loaders) { _loaders = loaders; } 139 void set_loaders(ClassLoaderData** loaders) { _loaders = loaders; }
136 140
137 oop loader(int i) { return _loaders[i]; } 141 ClassLoaderData* loader_data(int i) { return _loaders[i]; }
138 oop* loader_addr(int i) { return &_loaders[i]; } 142 void set_loader_data(int i, ClassLoaderData* p) { _loaders[i] = p; }
139 void set_loader(int i, oop p) { _loaders[i] = p; } 143 // convenience
140 144 void set_loader(int i, oop p);
141 }; 145 };
142 146
143 #endif // SHARE_VM_CLASSFILE_LOADERCONSTRAINTS_HPP 147 #endif // SHARE_VM_CLASSFILE_LOADERCONSTRAINTS_HPP