annotate src/share/vm/oops/markOop.hpp @ 4181:319860ae697a

Simplify FrameMap: make offsets of spill slots and outgoing parameters independent so that they can be allocated at the same time, eliminating the separate phases. This makes the separate StackBlock unnecesary. Change CiStackSlot to use byte offsets instead of spill slot index. This makes CiTarget.spillSlotSize unnecessary.
author Christian Wimmer <Christian.Wimmer@Oracle.com>
date Mon, 02 Jan 2012 14:16:08 -0800
parents 1d1603768966
children da91efe96a93
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2426
1d1603768966 7010070: Update all 2010 Oracle-changed OpenJDK files to have the proper copyright dates - second pass
trims
parents: 2177
diff changeset
2 * Copyright (c) 1997, 2011, 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: 1546
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1546
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: 1546
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_OOPS_MARKOOP_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #define SHARE_VM_OOPS_MARKOOP_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/oop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29
0
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // The markOop describes the header of an object.
a61af66fc99e Initial load
duke
parents:
diff changeset
31 //
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // Note that the mark is not a real oop but just a word.
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // It is placed in the oop hierarchy for historical reasons.
a61af66fc99e Initial load
duke
parents:
diff changeset
34 //
1546
a00b51b2dda4 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 356
diff changeset
35 // Bit-format of an object header (most significant first, big endian layout below):
a00b51b2dda4 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 356
diff changeset
36 //
a00b51b2dda4 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 356
diff changeset
37 // 32 bits:
a00b51b2dda4 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 356
diff changeset
38 // --------
a00b51b2dda4 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 356
diff changeset
39 // hash:25 ------------>| age:4 biased_lock:1 lock:2 (normal object)
a00b51b2dda4 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 356
diff changeset
40 // JavaThread*:23 epoch:2 age:4 biased_lock:1 lock:2 (biased object)
a00b51b2dda4 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 356
diff changeset
41 // size:32 ------------------------------------------>| (CMS free block)
a00b51b2dda4 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 356
diff changeset
42 // PromotedObject*:29 ---------->| promo_bits:3 ----->| (CMS promoted object)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
43 //
1546
a00b51b2dda4 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 356
diff changeset
44 // 64 bits:
a00b51b2dda4 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 356
diff changeset
45 // --------
a00b51b2dda4 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 356
diff changeset
46 // unused:25 hash:31 -->| unused:1 age:4 biased_lock:1 lock:2 (normal object)
a00b51b2dda4 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 356
diff changeset
47 // JavaThread*:54 epoch:2 unused:1 age:4 biased_lock:1 lock:2 (biased object)
a00b51b2dda4 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 356
diff changeset
48 // PromotedObject*:61 --------------------->| promo_bits:3 ----->| (CMS promoted object)
a00b51b2dda4 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 356
diff changeset
49 // size:64 ----------------------------------------------------->| (CMS free block)
a00b51b2dda4 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 356
diff changeset
50 //
a00b51b2dda4 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 356
diff changeset
51 // unused:25 hash:31 -->| cms_free:1 age:4 biased_lock:1 lock:2 (COOPs && normal object)
a00b51b2dda4 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 356
diff changeset
52 // JavaThread*:54 epoch:2 cms_free:1 age:4 biased_lock:1 lock:2 (COOPs && biased object)
a00b51b2dda4 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 356
diff changeset
53 // narrowOop:32 unused:24 cms_free:1 unused:4 promo_bits:3 ----->| (COOPs && CMS promoted object)
a00b51b2dda4 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 356
diff changeset
54 // unused:21 size:35 -->| cms_free:1 unused:7 ------------------>| (COOPs && CMS free block)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
55 //
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // - hash contains the identity hash value: largest value is
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // 31 bits, see os::random(). Also, 64-bit vm's require
a61af66fc99e Initial load
duke
parents:
diff changeset
58 // a hash value no bigger than 32 bits because they will not
a61af66fc99e Initial load
duke
parents:
diff changeset
59 // properly generate a mask larger than that: see library_call.cpp
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // and c1_CodePatterns_sparc.cpp.
a61af66fc99e Initial load
duke
parents:
diff changeset
61 //
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // - the biased lock pattern is used to bias a lock toward a given
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // thread. When this pattern is set in the low three bits, the lock
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // is either biased toward a given thread or "anonymously" biased,
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // indicating that it is possible for it to be biased. When the
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // lock is biased toward a given thread, locking and unlocking can
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // be performed by that thread without using atomic operations.
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // When a lock's bias is revoked, it reverts back to the normal
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // locking scheme described below.
a61af66fc99e Initial load
duke
parents:
diff changeset
70 //
a61af66fc99e Initial load
duke
parents:
diff changeset
71 // Note that we are overloading the meaning of the "unlocked" state
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // of the header. Because we steal a bit from the age we can
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // guarantee that the bias pattern will never be seen for a truly
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // unlocked object.
a61af66fc99e Initial load
duke
parents:
diff changeset
75 //
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // Note also that the biased state contains the age bits normally
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // contained in the object header. Large increases in scavenge
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // times were seen when these bits were absent and an arbitrary age
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // assigned to all biased objects, because they tended to consume a
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // significant fraction of the eden semispaces and were not
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // promoted promptly, causing an increase in the amount of copying
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // performed. The runtime system aligns all JavaThread* pointers to
1546
a00b51b2dda4 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 356
diff changeset
83 // a very large value (currently 128 bytes (32bVM) or 256 bytes (64bVM))
a00b51b2dda4 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 356
diff changeset
84 // to make room for the age bits & the epoch bits (used in support of
a00b51b2dda4 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link
ysr
parents: 356
diff changeset
85 // biased locking), and for the CMS "freeness" bit in the 64bVM (+COOPs).
0
a61af66fc99e Initial load
duke
parents:
diff changeset
86 //
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // [JavaThread* | epoch | age | 1 | 01] lock is biased toward given thread
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // [0 | epoch | age | 1 | 01] lock is anonymously biased
a61af66fc99e Initial load
duke
parents:
diff changeset
89 //
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // - the two lock bits are used to describe three states: locked/unlocked and monitor.
a61af66fc99e Initial load
duke
parents:
diff changeset
91 //
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // [ptr | 00] locked ptr points to real header on stack
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // [header | 0 | 01] unlocked regular object header
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // [ptr | 10] monitor inflated lock (header is wapped out)
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // [ptr | 11] marked used by markSweep to mark an object
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // not valid at any other time
a61af66fc99e Initial load
duke
parents:
diff changeset
97 //
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // We assume that stack/thread pointers have the lowest two bits cleared.
a61af66fc99e Initial load
duke
parents:
diff changeset
99
a61af66fc99e Initial load
duke
parents:
diff changeset
100 class BasicLock;
a61af66fc99e Initial load
duke
parents:
diff changeset
101 class ObjectMonitor;
a61af66fc99e Initial load
duke
parents:
diff changeset
102 class JavaThread;
a61af66fc99e Initial load
duke
parents:
diff changeset
103
a61af66fc99e Initial load
duke
parents:
diff changeset
104 class markOopDesc: public oopDesc {
a61af66fc99e Initial load
duke
parents:
diff changeset
105 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // Conversion
a61af66fc99e Initial load
duke
parents:
diff changeset
107 uintptr_t value() const { return (uintptr_t) this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // Constants
a61af66fc99e Initial load
duke
parents:
diff changeset
111 enum { age_bits = 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
112 lock_bits = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
113 biased_lock_bits = 1,
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 48
diff changeset
114 max_hash_bits = BitsPerWord - age_bits - lock_bits - biased_lock_bits,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
115 hash_bits = max_hash_bits > 31 ? 31 : max_hash_bits,
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
116 cms_bits = LP64_ONLY(1) NOT_LP64(0),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
117 epoch_bits = 2
a61af66fc99e Initial load
duke
parents:
diff changeset
118 };
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 // The biased locking code currently requires that the age bits be
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
121 // contiguous to the lock bits.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
122 enum { lock_shift = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
123 biased_lock_shift = lock_bits,
a61af66fc99e Initial load
duke
parents:
diff changeset
124 age_shift = lock_bits + biased_lock_bits,
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
125 cms_shift = age_shift + age_bits,
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
126 hash_shift = cms_shift + cms_bits,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
127 epoch_shift = hash_shift
a61af66fc99e Initial load
duke
parents:
diff changeset
128 };
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 enum { lock_mask = right_n_bits(lock_bits),
a61af66fc99e Initial load
duke
parents:
diff changeset
131 lock_mask_in_place = lock_mask << lock_shift,
a61af66fc99e Initial load
duke
parents:
diff changeset
132 biased_lock_mask = right_n_bits(lock_bits + biased_lock_bits),
a61af66fc99e Initial load
duke
parents:
diff changeset
133 biased_lock_mask_in_place= biased_lock_mask << lock_shift,
a61af66fc99e Initial load
duke
parents:
diff changeset
134 biased_lock_bit_in_place = 1 << biased_lock_shift,
a61af66fc99e Initial load
duke
parents:
diff changeset
135 age_mask = right_n_bits(age_bits),
a61af66fc99e Initial load
duke
parents:
diff changeset
136 age_mask_in_place = age_mask << age_shift,
a61af66fc99e Initial load
duke
parents:
diff changeset
137 epoch_mask = right_n_bits(epoch_bits),
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
138 epoch_mask_in_place = epoch_mask << epoch_shift,
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
139 cms_mask = right_n_bits(cms_bits),
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
140 cms_mask_in_place = cms_mask << cms_shift
0
a61af66fc99e Initial load
duke
parents:
diff changeset
141 #ifndef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
142 ,hash_mask = right_n_bits(hash_bits),
a61af66fc99e Initial load
duke
parents:
diff changeset
143 hash_mask_in_place = (address_word)hash_mask << hash_shift
a61af66fc99e Initial load
duke
parents:
diff changeset
144 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
145 };
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // Alignment of JavaThread pointers encoded in object header required by biased locking
a61af66fc99e Initial load
duke
parents:
diff changeset
148 enum { biased_lock_alignment = 2 << (epoch_shift + epoch_bits)
a61af66fc99e Initial load
duke
parents:
diff changeset
149 };
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 #ifdef _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // These values are too big for Win64
a61af66fc99e Initial load
duke
parents:
diff changeset
153 const static uintptr_t hash_mask = right_n_bits(hash_bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
154 const static uintptr_t hash_mask_in_place =
a61af66fc99e Initial load
duke
parents:
diff changeset
155 (address_word)hash_mask << hash_shift;
a61af66fc99e Initial load
duke
parents:
diff changeset
156 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 enum { locked_value = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
159 unlocked_value = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
160 monitor_value = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
161 marked_value = 3,
a61af66fc99e Initial load
duke
parents:
diff changeset
162 biased_lock_pattern = 5
a61af66fc99e Initial load
duke
parents:
diff changeset
163 };
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 enum { no_hash = 0 }; // no hash value assigned
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 enum { no_hash_in_place = (address_word)no_hash << hash_shift,
a61af66fc99e Initial load
duke
parents:
diff changeset
168 no_lock_in_place = unlocked_value
a61af66fc99e Initial load
duke
parents:
diff changeset
169 };
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 enum { max_age = age_mask };
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173 enum { max_bias_epoch = epoch_mask };
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // Biased Locking accessors.
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // These must be checked by all code which calls into the
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // ObjectSynchronizer and other code. The biasing is not understood
a61af66fc99e Initial load
duke
parents:
diff changeset
178 // by the lower-level CAS-based locking code, although the runtime
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // fixes up biased locks to be compatible with it when a bias is
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // revoked.
a61af66fc99e Initial load
duke
parents:
diff changeset
181 bool has_bias_pattern() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
182 return (mask_bits(value(), biased_lock_mask_in_place) == biased_lock_pattern);
a61af66fc99e Initial load
duke
parents:
diff changeset
183 }
a61af66fc99e Initial load
duke
parents:
diff changeset
184 JavaThread* biased_locker() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
185 assert(has_bias_pattern(), "should not call this otherwise");
a61af66fc99e Initial load
duke
parents:
diff changeset
186 return (JavaThread*) ((intptr_t) (mask_bits(value(), ~(biased_lock_mask_in_place | age_mask_in_place | epoch_mask_in_place))));
a61af66fc99e Initial load
duke
parents:
diff changeset
187 }
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // Indicates that the mark has the bias bit set but that it has not
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // yet been biased toward a particular thread
a61af66fc99e Initial load
duke
parents:
diff changeset
190 bool is_biased_anonymously() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
191 return (has_bias_pattern() && (biased_locker() == NULL));
a61af66fc99e Initial load
duke
parents:
diff changeset
192 }
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // Indicates epoch in which this bias was acquired. If the epoch
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // changes due to too many bias revocations occurring, the biases
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // from the previous epochs are all considered invalid.
a61af66fc99e Initial load
duke
parents:
diff changeset
196 int bias_epoch() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
197 assert(has_bias_pattern(), "should not call this otherwise");
a61af66fc99e Initial load
duke
parents:
diff changeset
198 return (mask_bits(value(), epoch_mask_in_place) >> epoch_shift);
a61af66fc99e Initial load
duke
parents:
diff changeset
199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
200 markOop set_bias_epoch(int epoch) {
a61af66fc99e Initial load
duke
parents:
diff changeset
201 assert(has_bias_pattern(), "should not call this otherwise");
a61af66fc99e Initial load
duke
parents:
diff changeset
202 assert((epoch & (~epoch_mask)) == 0, "epoch overflow");
a61af66fc99e Initial load
duke
parents:
diff changeset
203 return markOop(mask_bits(value(), ~epoch_mask_in_place) | (epoch << epoch_shift));
a61af66fc99e Initial load
duke
parents:
diff changeset
204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
205 markOop incr_bias_epoch() {
a61af66fc99e Initial load
duke
parents:
diff changeset
206 return set_bias_epoch((1 + bias_epoch()) & epoch_mask);
a61af66fc99e Initial load
duke
parents:
diff changeset
207 }
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // Prototype mark for initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
209 static markOop biased_locking_prototype() {
a61af66fc99e Initial load
duke
parents:
diff changeset
210 return markOop( biased_lock_pattern );
a61af66fc99e Initial load
duke
parents:
diff changeset
211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
212
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // lock accessors (note that these assume lock_shift == 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
214 bool is_locked() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
215 return (mask_bits(value(), lock_mask_in_place) != unlocked_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
216 }
a61af66fc99e Initial load
duke
parents:
diff changeset
217 bool is_unlocked() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
218 return (mask_bits(value(), biased_lock_mask_in_place) == unlocked_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
219 }
a61af66fc99e Initial load
duke
parents:
diff changeset
220 bool is_marked() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
221 return (mask_bits(value(), lock_mask_in_place) == marked_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
222 }
a61af66fc99e Initial load
duke
parents:
diff changeset
223 bool is_neutral() const { return (mask_bits(value(), biased_lock_mask_in_place) == unlocked_value); }
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // Special temporary state of the markOop while being inflated.
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // Code that looks at mark outside a lock need to take this into account.
a61af66fc99e Initial load
duke
parents:
diff changeset
227 bool is_being_inflated() const { return (value() == 0); }
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // Distinguished markword value - used when inflating over
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // an existing stacklock. 0 indicates the markword is "BUSY".
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // Lockword mutators that use a LD...CAS idiom should always
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // check for and avoid overwriting a 0 value installed by some
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // other thread. (They should spin or block instead. The 0 value
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // is transient and *should* be short-lived).
a61af66fc99e Initial load
duke
parents:
diff changeset
235 static markOop INFLATING() { return (markOop) 0; } // inflate-in-progress
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237 // Should this header be preserved during GC?
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
238 inline bool must_be_preserved(oop obj_containing_mark) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
239 inline bool must_be_preserved_with_bias(oop obj_containing_mark) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // Should this header (including its age bits) be preserved in the
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // case of a promotion failure during scavenge?
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // Note that we special case this situation. We want to avoid
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // calling BiasedLocking::preserve_marks()/restore_marks() (which
a61af66fc99e Initial load
duke
parents:
diff changeset
245 // decrease the number of mark words that need to be preserved
a61af66fc99e Initial load
duke
parents:
diff changeset
246 // during GC) during each scavenge. During scavenges in which there
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // is no promotion failure, we actually don't need to call the above
a61af66fc99e Initial load
duke
parents:
diff changeset
248 // routines at all, since we don't mutate and re-initialize the
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // marks of promoted objects using init_mark(). However, during
a61af66fc99e Initial load
duke
parents:
diff changeset
250 // scavenges which result in promotion failure, we do re-initialize
a61af66fc99e Initial load
duke
parents:
diff changeset
251 // the mark words of objects, meaning that we should have called
a61af66fc99e Initial load
duke
parents:
diff changeset
252 // these mark word preservation routines. Currently there's no good
a61af66fc99e Initial load
duke
parents:
diff changeset
253 // place in which to call them in any of the scavengers (although
a61af66fc99e Initial load
duke
parents:
diff changeset
254 // guarded by appropriate locks we could make one), but the
a61af66fc99e Initial load
duke
parents:
diff changeset
255 // observation is that promotion failures are quite rare and
a61af66fc99e Initial load
duke
parents:
diff changeset
256 // reducing the number of mark words preserved during them isn't a
a61af66fc99e Initial load
duke
parents:
diff changeset
257 // high priority.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
258 inline bool must_be_preserved_for_promotion_failure(oop obj_containing_mark) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
259 inline bool must_be_preserved_with_bias_for_promotion_failure(oop obj_containing_mark) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261 // Should this header be preserved during a scavenge where CMS is
a61af66fc99e Initial load
duke
parents:
diff changeset
262 // the old generation?
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // (This is basically the same body as must_be_preserved_for_promotion_failure(),
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // but takes the klassOop as argument instead)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
265 inline bool must_be_preserved_for_cms_scavenge(klassOop klass_of_obj_containing_mark) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
266 inline bool must_be_preserved_with_bias_for_cms_scavenge(klassOop klass_of_obj_containing_mark) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
267
a61af66fc99e Initial load
duke
parents:
diff changeset
268 // WARNING: The following routines are used EXCLUSIVELY by
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // synchronization functions. They are not really gc safe.
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // They must get updated if markOop layout get changed.
a61af66fc99e Initial load
duke
parents:
diff changeset
271 markOop set_unlocked() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
272 return markOop(value() | unlocked_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
274 bool has_locker() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
275 return ((value() & lock_mask_in_place) == locked_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
276 }
a61af66fc99e Initial load
duke
parents:
diff changeset
277 BasicLock* locker() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
278 assert(has_locker(), "check");
a61af66fc99e Initial load
duke
parents:
diff changeset
279 return (BasicLock*) value();
a61af66fc99e Initial load
duke
parents:
diff changeset
280 }
a61af66fc99e Initial load
duke
parents:
diff changeset
281 bool has_monitor() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
282 return ((value() & monitor_value) != 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
284 ObjectMonitor* monitor() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
285 assert(has_monitor(), "check");
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // Use xor instead of &~ to provide one extra tag-bit check.
a61af66fc99e Initial load
duke
parents:
diff changeset
287 return (ObjectMonitor*) (value() ^ monitor_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
288 }
a61af66fc99e Initial load
duke
parents:
diff changeset
289 bool has_displaced_mark_helper() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
290 return ((value() & unlocked_value) == 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
292 markOop displaced_mark_helper() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
293 assert(has_displaced_mark_helper(), "check");
a61af66fc99e Initial load
duke
parents:
diff changeset
294 intptr_t ptr = (value() & ~monitor_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
295 return *(markOop*)ptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
296 }
a61af66fc99e Initial load
duke
parents:
diff changeset
297 void set_displaced_mark_helper(markOop m) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
298 assert(has_displaced_mark_helper(), "check");
a61af66fc99e Initial load
duke
parents:
diff changeset
299 intptr_t ptr = (value() & ~monitor_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
300 *(markOop*)ptr = m;
a61af66fc99e Initial load
duke
parents:
diff changeset
301 }
a61af66fc99e Initial load
duke
parents:
diff changeset
302 markOop copy_set_hash(intptr_t hash) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
303 intptr_t tmp = value() & (~hash_mask_in_place);
a61af66fc99e Initial load
duke
parents:
diff changeset
304 tmp |= ((hash & hash_mask) << hash_shift);
a61af66fc99e Initial load
duke
parents:
diff changeset
305 return (markOop)tmp;
a61af66fc99e Initial load
duke
parents:
diff changeset
306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // it is only used to be stored into BasicLock as the
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // indicator that the lock is using heavyweight monitor
a61af66fc99e Initial load
duke
parents:
diff changeset
309 static markOop unused_mark() {
a61af66fc99e Initial load
duke
parents:
diff changeset
310 return (markOop) marked_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
311 }
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // the following two functions create the markOop to be
a61af66fc99e Initial load
duke
parents:
diff changeset
313 // stored into object header, it encodes monitor info
a61af66fc99e Initial load
duke
parents:
diff changeset
314 static markOop encode(BasicLock* lock) {
a61af66fc99e Initial load
duke
parents:
diff changeset
315 return (markOop) lock;
a61af66fc99e Initial load
duke
parents:
diff changeset
316 }
a61af66fc99e Initial load
duke
parents:
diff changeset
317 static markOop encode(ObjectMonitor* monitor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
318 intptr_t tmp = (intptr_t) monitor;
a61af66fc99e Initial load
duke
parents:
diff changeset
319 return (markOop) (tmp | monitor_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
320 }
a61af66fc99e Initial load
duke
parents:
diff changeset
321 static markOop encode(JavaThread* thread, int age, int bias_epoch) {
a61af66fc99e Initial load
duke
parents:
diff changeset
322 intptr_t tmp = (intptr_t) thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
323 assert(UseBiasedLocking && ((tmp & (epoch_mask_in_place | age_mask_in_place | biased_lock_mask_in_place)) == 0), "misaligned JavaThread pointer");
a61af66fc99e Initial load
duke
parents:
diff changeset
324 assert(age <= max_age, "age too large");
a61af66fc99e Initial load
duke
parents:
diff changeset
325 assert(bias_epoch <= max_bias_epoch, "bias epoch too large");
a61af66fc99e Initial load
duke
parents:
diff changeset
326 return (markOop) (tmp | (bias_epoch << epoch_shift) | (age << age_shift) | biased_lock_pattern);
a61af66fc99e Initial load
duke
parents:
diff changeset
327 }
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329 // used to encode pointers during GC
a61af66fc99e Initial load
duke
parents:
diff changeset
330 markOop clear_lock_bits() { return markOop(value() & ~lock_mask_in_place); }
a61af66fc99e Initial load
duke
parents:
diff changeset
331
a61af66fc99e Initial load
duke
parents:
diff changeset
332 // age operations
a61af66fc99e Initial load
duke
parents:
diff changeset
333 markOop set_marked() { return markOop((value() & ~lock_mask_in_place) | marked_value); }
a61af66fc99e Initial load
duke
parents:
diff changeset
334
a61af66fc99e Initial load
duke
parents:
diff changeset
335 int age() const { return mask_bits(value() >> age_shift, age_mask); }
a61af66fc99e Initial load
duke
parents:
diff changeset
336 markOop set_age(int v) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
337 assert((v & ~age_mask) == 0, "shouldn't overflow age field");
a61af66fc99e Initial load
duke
parents:
diff changeset
338 return markOop((value() & ~age_mask_in_place) | (((intptr_t)v & age_mask) << age_shift));
a61af66fc99e Initial load
duke
parents:
diff changeset
339 }
a61af66fc99e Initial load
duke
parents:
diff changeset
340 markOop incr_age() const { return age() == max_age ? markOop(this) : set_age(age() + 1); }
a61af66fc99e Initial load
duke
parents:
diff changeset
341
a61af66fc99e Initial load
duke
parents:
diff changeset
342 // hash operations
a61af66fc99e Initial load
duke
parents:
diff changeset
343 intptr_t hash() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
344 return mask_bits(value() >> hash_shift, hash_mask);
a61af66fc99e Initial load
duke
parents:
diff changeset
345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 bool has_no_hash() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
348 return hash() == no_hash;
a61af66fc99e Initial load
duke
parents:
diff changeset
349 }
a61af66fc99e Initial load
duke
parents:
diff changeset
350
a61af66fc99e Initial load
duke
parents:
diff changeset
351 // Prototype mark for initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
352 static markOop prototype() {
a61af66fc99e Initial load
duke
parents:
diff changeset
353 return markOop( no_hash_in_place | no_lock_in_place );
a61af66fc99e Initial load
duke
parents:
diff changeset
354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
355
a61af66fc99e Initial load
duke
parents:
diff changeset
356 // Helper function for restoration of unmarked mark oops during GC
a61af66fc99e Initial load
duke
parents:
diff changeset
357 static inline markOop prototype_for_object(oop obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
358
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // Debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
360 void print_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
361
a61af66fc99e Initial load
duke
parents:
diff changeset
362 // Prepare address of oop for placement into mark
a61af66fc99e Initial load
duke
parents:
diff changeset
363 inline static markOop encode_pointer_as_mark(void* p) { return markOop(p)->set_marked(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
364
a61af66fc99e Initial load
duke
parents:
diff changeset
365 // Recover address of oop from encoded form used in mark
a61af66fc99e Initial load
duke
parents:
diff changeset
366 inline void* decode_pointer() { if (UseBiasedLocking && has_bias_pattern()) return NULL; return clear_lock_bits(); }
48
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
367
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
368 // see the definition in markOop.cpp for the gory details
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
369 bool should_not_be_cached() const;
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
370
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
371 // These markOops indicate cms free chunk blocks and not objects.
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
372 // In 64 bit, the markOop is set to distinguish them from oops.
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
373 // These are defined in 32 bit mode for vmStructs.
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
374 const static uintptr_t cms_free_chunk_pattern = 0x1;
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
375
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
376 // Constants for the size field.
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
377 enum { size_shift = cms_shift + cms_bits,
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
378 size_bits = 35 // need for compressed oops 32G
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
379 };
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
380 // These values are too big for Win64
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
381 const static uintptr_t size_mask = LP64_ONLY(right_n_bits(size_bits))
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
382 NOT_LP64(0);
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
383 const static uintptr_t size_mask_in_place =
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
384 (address_word)size_mask << size_shift;
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
385
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
386 #ifdef _LP64
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
387 static markOop cms_free_prototype() {
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
388 return markOop(((intptr_t)prototype() & ~cms_mask_in_place) |
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
389 ((cms_free_chunk_pattern & cms_mask) << cms_shift));
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
390 }
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
391 uintptr_t cms_encoding() const {
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
392 return mask_bits(value() >> cms_shift, cms_mask);
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
393 }
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
394 bool is_cms_free_chunk() const {
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
395 return is_neutral() &&
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
396 (cms_encoding() & cms_free_chunk_pattern) == cms_free_chunk_pattern;
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
397 }
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
398
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
399 size_t get_size() const { return (size_t)(value() >> size_shift); }
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
400 static markOop set_size_and_free(size_t size) {
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
401 assert((size & ~size_mask) == 0, "shouldn't overflow size field");
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
402 return markOop(((intptr_t)cms_free_prototype() & ~size_mask_in_place) |
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
403 (((intptr_t)size & size_mask) << size_shift));
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
404 }
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents: 113
diff changeset
405 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
406 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
407
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
408 #endif // SHARE_VM_OOPS_MARKOOP_HPP