annotate src/share/vm/interpreter/oopMapCache.hpp @ 14649:f6301b007a16

6498581: ThreadInterruptTest3 produces wrong output on Windows Summary: There is race condition between os::interrupt and os::is_interrupted on Windows. In JVM_Sleep(Thread.sleep), check if thread gets interrupted, it may see interrupted but not really interrupted so cause spurious waking up (early return from sleep). Fix by checking if interrupt event really gets set thus prevent false return. For intrinsic of _isInterrupted, on Windows, go fastpath only on bit not set. Reviewed-by: acorn, kvn Contributed-by: david.holmes@oracle.com, yumin.qi@oracle.com
author minqi
date Wed, 26 Feb 2014 15:20:41 -0800
parents da91efe96a93
children c204e2044c29
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
25 #ifndef SHARE_VM_INTERPRETER_OOPMAPCACHE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #define SHARE_VM_INTERPRETER_OOPMAPCACHE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "oops/generateOopMap.hpp"
1983
c760f78e0a53 7003125: precompiled.hpp is included when precompiled headers are not used
stefank
parents: 1972
diff changeset
29 #include "runtime/mutex.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30
0
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // A Cache for storing (method, bci) -> oopMap.
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // The memory management system uses the cache when locating object
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // references in an interpreted frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
34 //
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
35 // OopMapCache's are allocated lazily per InstanceKlass.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // The oopMap (InterpreterOopMap) is stored as a bit mask. If the
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // bit_mask can fit into two words it is stored in
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // the _bit_mask array, otherwise it is allocated on the heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // For OopMapCacheEntry the bit_mask is allocated in the C heap
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // because these entries persist between garbage collections.
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // For InterpreterOopMap the bit_mask is allocated in
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // a resource area for better performance. InterpreterOopMap
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // should only be created and deleted during same garbage collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
45 //
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // If ENABBLE_ZAP_DEAD_LOCALS is defined, two bits are used
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // per entry instead of one. In all cases,
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // the first bit is set to indicate oops as opposed to other
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // values. If the second bit is available,
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // it is set for dead values. We get the following encoding:
a61af66fc99e Initial load
duke
parents:
diff changeset
51 //
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // 00 live value
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // 01 live oop
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // 10 dead value
a61af66fc99e Initial load
duke
parents:
diff changeset
55 // 11 <unused> (we cannot distinguish between dead oops or values with the current oop map generator)
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 class OffsetClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
59 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
60 virtual void offset_do(int offset) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 };
a61af66fc99e Initial load
duke
parents:
diff changeset
62
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 class InterpreterOopMap: ResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
65 friend class OopMapCache;
a61af66fc99e Initial load
duke
parents:
diff changeset
66
a61af66fc99e Initial load
duke
parents:
diff changeset
67 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
68 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
69 N = 2, // the number of words reserved
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // for inlined mask storage
a61af66fc99e Initial load
duke
parents:
diff changeset
71 small_mask_limit = N * BitsPerWord, // the maximum number of bits
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // available for small masks,
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // small_mask_limit can be set to 0
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // for testing bit_mask allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76 #ifdef ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
77 bits_per_entry = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
78 dead_bit_number = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
79 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
80 bits_per_entry = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
81 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
82 oop_bit_number = 0
a61af66fc99e Initial load
duke
parents:
diff changeset
83 };
a61af66fc99e Initial load
duke
parents:
diff changeset
84
a61af66fc99e Initial load
duke
parents:
diff changeset
85 private:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
86 Method* _method; // the method for which the mask is valid
0
a61af66fc99e Initial load
duke
parents:
diff changeset
87 unsigned short _bci; // the bci for which the mask is valid
a61af66fc99e Initial load
duke
parents:
diff changeset
88 int _mask_size; // the mask size in bits
a61af66fc99e Initial load
duke
parents:
diff changeset
89 int _expression_stack_size; // the size of the expression stack in slots
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
92 intptr_t _bit_mask[N]; // the bit mask if
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // mask_size <= small_mask_limit,
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // ptr to bit mask otherwise
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // "protected" so that sub classes can
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // access it without using trickery in
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // methd bit_mask().
a61af66fc99e Initial load
duke
parents:
diff changeset
98 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
99 bool _resource_allocate_bit_mask;
a61af66fc99e Initial load
duke
parents:
diff changeset
100 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // access methods
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
103 Method* method() const { return _method; }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
104 void set_method(Method* v) { _method = v; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
105 int bci() const { return _bci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
106 void set_bci(int v) { _bci = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
107 int mask_size() const { return _mask_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
108 void set_mask_size(int v) { _mask_size = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
109 int number_of_entries() const { return mask_size() / bits_per_entry; }
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // Test bit mask size and return either the in-line bit mask or allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // bit mask.
a61af66fc99e Initial load
duke
parents:
diff changeset
112 uintptr_t* bit_mask() { return (uintptr_t*)(mask_size() <= small_mask_limit ? (intptr_t)_bit_mask : _bit_mask[0]); }
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // return the word size of_bit_mask. mask_size() <= 4 * MAX_USHORT
a61af66fc99e Initial load
duke
parents:
diff changeset
115 size_t mask_word_size() {
a61af66fc99e Initial load
duke
parents:
diff changeset
116 return (mask_size() + BitsPerWord - 1) / BitsPerWord;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 }
a61af66fc99e Initial load
duke
parents:
diff changeset
118
a61af66fc99e Initial load
duke
parents:
diff changeset
119 uintptr_t entry_at(int offset) { int i = offset * bits_per_entry; return bit_mask()[i / BitsPerWord] >> (i % BitsPerWord); }
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121 void set_expression_stack_size(int sz) { _expression_stack_size = sz; }
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 #ifdef ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
124 bool is_dead(int offset) { return (entry_at(offset) & (1 << dead_bit_number)) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
125 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
126
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // Lookup
a61af66fc99e Initial load
duke
parents:
diff changeset
128 bool match(methodHandle method, int bci) { return _method == method() && _bci == bci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
129 bool is_empty();
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // Initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
132 void initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
135 InterpreterOopMap();
a61af66fc99e Initial load
duke
parents:
diff changeset
136 ~InterpreterOopMap();
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // Copy the OopMapCacheEntry in parameter "from" into this
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // InterpreterOopMap. If the _bit_mask[0] in "from" points to
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // allocated space (i.e., the bit mask was to large to hold
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // in-line), allocate the space from a Resource area.
a61af66fc99e Initial load
duke
parents:
diff changeset
142 void resource_copy(OopMapCacheEntry* from);
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 void iterate_oop(OffsetClosure* oop_closure);
a61af66fc99e Initial load
duke
parents:
diff changeset
145 void print();
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 bool is_oop (int offset) { return (entry_at(offset) & (1 << oop_bit_number )) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 int expression_stack_size() { return _expression_stack_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 #ifdef ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
152 void iterate_all(OffsetClosure* oop_closure, OffsetClosure* value_closure, OffsetClosure* dead_closure);
a61af66fc99e Initial load
duke
parents:
diff changeset
153 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
154 };
a61af66fc99e Initial load
duke
parents:
diff changeset
155
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 1983
diff changeset
156 class OopMapCache : public CHeapObj<mtClass> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
157 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
158 enum { _size = 32, // Use fixed size for now
a61af66fc99e Initial load
duke
parents:
diff changeset
159 _probe_depth = 3 // probe depth in case of collisions
a61af66fc99e Initial load
duke
parents:
diff changeset
160 };
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 OopMapCacheEntry* _array;
a61af66fc99e Initial load
duke
parents:
diff changeset
163
a61af66fc99e Initial load
duke
parents:
diff changeset
164 unsigned int hash_value_for(methodHandle method, int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
165 OopMapCacheEntry* entry_at(int i) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 Mutex _mut;
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 void flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
172 OopMapCache();
a61af66fc99e Initial load
duke
parents:
diff changeset
173 ~OopMapCache(); // free up memory
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // flush cache entry is occupied by an obsolete method
a61af66fc99e Initial load
duke
parents:
diff changeset
176 void flush_obsolete_entries();
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178 // Returns the oopMap for (method, bci) in parameter "entry".
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // Returns false if an oop map was not found.
a61af66fc99e Initial load
duke
parents:
diff changeset
180 void lookup(methodHandle method, int bci, InterpreterOopMap* entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // Compute an oop map without updating the cache or grabbing any locks (for debugging)
a61af66fc99e Initial load
duke
parents:
diff changeset
183 static void compute_one_oop_map(methodHandle method, int bci, InterpreterOopMap* entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
184
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // Returns total no. of bytes allocated as part of OopMapCache's
a61af66fc99e Initial load
duke
parents:
diff changeset
186 static long memory_usage() PRODUCT_RETURN0;
a61af66fc99e Initial load
duke
parents:
diff changeset
187 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
188
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
189 #endif // SHARE_VM_INTERPRETER_OOPMAPCACHE_HPP