Mercurial > hg > graal-jvmci-8
annotate src/share/vm/classfile/loaderConstraints.hpp @ 1091:6aa7255741f3
6906727: UseCompressedOops: some card-marking fixes related to object arrays
Summary: Introduced a new write_ref_array(HeapWords* start, size_t count) method that does the requisite MemRegion range calculation so (some of the) clients of the erstwhile write_ref_array(MemRegion mr) do not need to worry. This removed all external uses of array_size(), which was also simplified and made private. Asserts were added to catch other possible issues. Further, less essential, fixes stemming from this investigation are deferred to CR 6904516 (to follow shortly in hs17).
Reviewed-by: kvn, coleenp, jmasa
author | ysr |
---|---|
date | Thu, 03 Dec 2009 15:01:57 -0800 |
parents | c89f86385056 |
children | 38836cf1d8d2 0c3f888b7636 |
rev | line source |
---|---|
0 | 1 /* |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
0
diff
changeset
|
2 * Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
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 | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, | |
20 * CA 95054 USA or visit www.sun.com if you need additional information or | |
21 * have any questions. | |
22 * | |
23 */ | |
24 | |
25 class LoaderConstraintEntry; | |
26 | |
27 class LoaderConstraintTable : public Hashtable { | |
28 friend class VMStructs; | |
29 private: | |
30 | |
31 enum Constants { | |
32 _loader_constraint_size = 107, // number of entries in constraint table | |
33 _nof_buckets = 1009 // number of buckets in hash table | |
34 }; | |
35 | |
36 LoaderConstraintEntry** find_loader_constraint(symbolHandle name, | |
37 Handle loader); | |
38 | |
39 public: | |
40 | |
41 LoaderConstraintTable(int nof_buckets); | |
42 | |
43 LoaderConstraintEntry* new_entry(unsigned int hash, symbolOop name, | |
44 klassOop klass, int num_loaders, | |
45 int max_loaders); | |
46 | |
47 LoaderConstraintEntry* bucket(int i) { | |
48 return (LoaderConstraintEntry*)Hashtable::bucket(i); | |
49 } | |
50 | |
51 LoaderConstraintEntry** bucket_addr(int i) { | |
52 return (LoaderConstraintEntry**)Hashtable::bucket_addr(i); | |
53 } | |
54 | |
55 // GC support | |
56 void oops_do(OopClosure* f); | |
57 void always_strong_classes_do(OopClosure* blk); | |
58 | |
59 // Check class loader constraints | |
60 bool add_entry(symbolHandle name, klassOop klass1, Handle loader1, | |
61 klassOop klass2, Handle loader2); | |
62 | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
0
diff
changeset
|
63 // Note: The main entry point for this module is via SystemDictionary. |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
0
diff
changeset
|
64 // SystemDictionary::check_signature_loaders(symbolHandle signature, |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
0
diff
changeset
|
65 // Handle loader1, Handle loader2, |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
0
diff
changeset
|
66 // bool is_method, TRAPS) |
0 | 67 |
68 klassOop find_constrained_klass(symbolHandle name, Handle loader); | |
69 klassOop find_constrained_elem_klass(symbolHandle name, symbolHandle elem_name, | |
70 Handle loader, TRAPS); | |
71 | |
72 | |
73 // Class loader constraints | |
74 | |
75 void ensure_loader_constraint_capacity(LoaderConstraintEntry *p, int nfree); | |
76 void extend_loader_constraint(LoaderConstraintEntry* p, Handle loader, | |
77 klassOop klass); | |
78 void merge_loader_constraints(LoaderConstraintEntry** pp1, | |
79 LoaderConstraintEntry** pp2, klassOop klass); | |
80 | |
81 bool check_or_update(instanceKlassHandle k, Handle loader, | |
82 symbolHandle name); | |
83 | |
84 | |
85 void purge_loader_constraints(BoolObjectClosure* is_alive); | |
86 | |
87 void verify(Dictionary* dictionary); | |
88 #ifndef PRODUCT | |
89 void print(); | |
90 #endif | |
91 }; | |
92 | |
93 class LoaderConstraintEntry : public HashtableEntry { | |
94 friend class VMStructs; | |
95 private: | |
96 symbolOop _name; // class name | |
97 int _num_loaders; | |
98 int _max_loaders; | |
99 oop* _loaders; // initiating loaders | |
100 | |
101 public: | |
102 | |
103 klassOop klass() { return (klassOop)literal(); } | |
104 klassOop* klass_addr() { return (klassOop*)literal_addr(); } | |
105 void set_klass(klassOop k) { set_literal(k); } | |
106 | |
107 LoaderConstraintEntry* next() { | |
108 return (LoaderConstraintEntry*)HashtableEntry::next(); | |
109 } | |
110 | |
111 LoaderConstraintEntry** next_addr() { | |
112 return (LoaderConstraintEntry**)HashtableEntry::next_addr(); | |
113 } | |
114 void set_next(LoaderConstraintEntry* next) { | |
115 HashtableEntry::set_next(next); | |
116 } | |
117 | |
118 symbolOop name() { return _name; } | |
119 symbolOop* name_addr() { return &_name; } | |
120 void set_name(symbolOop name) { _name = name; } | |
121 | |
122 int num_loaders() { return _num_loaders; } | |
123 void set_num_loaders(int i) { _num_loaders = i; } | |
124 | |
125 int max_loaders() { return _max_loaders; } | |
126 void set_max_loaders(int i) { _max_loaders = i; } | |
127 | |
128 oop* loaders() { return _loaders; } | |
129 void set_loaders(oop* loaders) { _loaders = loaders; } | |
130 | |
131 oop loader(int i) { return _loaders[i]; } | |
132 oop* loader_addr(int i) { return &_loaders[i]; } | |
133 void set_loader(int i, oop p) { _loaders[i] = p; } | |
134 | |
135 }; |