34 import sun.jvm.hotspot.utilities.Observable;
35 import sun.jvm.hotspot.utilities.Observer;
36
37 public class Mark extends VMObject {
38 static {
39 VM.registerVMInitializedObserver(new Observer() {
40 public void update(Observable o, Object data) {
41 initialize(VM.getVM().getTypeDataBase());
42 }
43 });
44 }
45
46 private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
47 Type type = db.lookupType("oopDesc");
48 markField = type.getCIntegerField("_mark");
49
50 ageBits = db.lookupLongConstant("markWord::age_bits").longValue();
51 lockBits = db.lookupLongConstant("markWord::lock_bits").longValue();
52 maxHashBits = db.lookupLongConstant("markWord::max_hash_bits").longValue();
53 hashBits = db.lookupLongConstant("markWord::hash_bits").longValue();
54 lockShift = db.lookupLongConstant("markWord::lock_shift").longValue();
55 ageShift = db.lookupLongConstant("markWord::age_shift").longValue();
56 hashShift = db.lookupLongConstant("markWord::hash_shift").longValue();
57 if (VM.getVM().isLP64()) {
58 klassShift = db.lookupLongConstant("markWord::klass_shift").longValue();
59 }
60 lockMask = db.lookupLongConstant("markWord::lock_mask").longValue();
61 lockMaskInPlace = db.lookupLongConstant("markWord::lock_mask_in_place").longValue();
62 ageMask = db.lookupLongConstant("markWord::age_mask").longValue();
63 ageMaskInPlace = db.lookupLongConstant("markWord::age_mask_in_place").longValue();
64 hashMask = db.lookupLongConstant("markWord::hash_mask").longValue();
65 hashMaskInPlace = db.lookupLongConstant("markWord::hash_mask_in_place").longValue();
66 lockedValue = db.lookupLongConstant("markWord::locked_value").longValue();
67 unlockedValue = db.lookupLongConstant("markWord::unlocked_value").longValue();
68 monitorValue = db.lookupLongConstant("markWord::monitor_value").longValue();
69 markedValue = db.lookupLongConstant("markWord::marked_value").longValue();
70 noHash = db.lookupLongConstant("markWord::no_hash").longValue();
71 noHashInPlace = db.lookupLongConstant("markWord::no_hash_in_place").longValue();
72 noLockInPlace = db.lookupLongConstant("markWord::no_lock_in_place").longValue();
73 maxAge = db.lookupLongConstant("markWord::max_age").longValue();
74 }
75
76 // Field accessors
77 private static CIntegerField markField;
78
79 // Constants -- read from VM
80 private static long ageBits;
81 private static long lockBits;
82 private static long maxHashBits;
83 private static long hashBits;
84
85 private static long lockShift;
86 private static long ageShift;
87 private static long hashShift;
88 private static long klassShift;
89
90 private static long lockMask;
91 private static long lockMaskInPlace;
92 private static long ageMask;
93 private static long ageMaskInPlace;
94 private static long hashMask;
95 private static long hashMaskInPlace;
96
97 private static long lockedValue;
98 private static long unlockedValue;
99 private static long monitorValue;
100 private static long markedValue;
101
102 private static long noHash;
103
104 private static long noHashInPlace;
105 private static long noLockInPlace;
106
107 private static long maxAge;
108
109 public static long getKlassShift() {
110 return klassShift;
111 }
112
113 public Mark(Address addr) {
114 super(addr);
115 }
169 return null;
170 }
171 // Use xor instead of &~ to provide one extra tag-bit check.
172 Address monAddr = valueAsAddress().xorWithMask(monitorValue);
173 return new ObjectMonitor(monAddr);
174 }
175 public boolean hasDisplacedMarkHelper() {
176 return ((value() & unlockedValue) == 0);
177 }
178 public Mark displacedMarkHelper() {
179 if (Assert.ASSERTS_ENABLED) {
180 Assert.that(hasDisplacedMarkHelper(), "check");
181 }
182 Address addr = valueAsAddress().andWithMask(~monitorValue);
183 return new Mark(addr.getAddressAt(0));
184 }
185 public int age() { return (int) Bits.maskBitsLong(value() >> ageShift, ageMask); }
186
187 // hash operations
188 public long hash() {
189 return Bits.maskBitsLong(value() >> hashShift, hashMask);
190 }
191
192 public boolean hasNoHash() {
193 return hash() == noHash;
194 }
195
196 public Klass getKlass() {
197 assert(VM.getVM().isCompactObjectHeadersEnabled());
198 return (Klass)Metadata.instantiateWrapperFor(addr.getCompKlassAddressAt(0));
199 }
200
201 // Debugging
202 public void printOn(PrintStream tty) {
203 if (isLocked()) {
204 tty.print("locked(0x" +
205 Long.toHexString(value()) + ")->");
206 displacedMarkHelper().printOn(tty);
207 } else {
208 if (Assert.ASSERTS_ENABLED) {
209 Assert.that(isUnlocked(), "just checking");
210 }
211 tty.print("mark(");
212 tty.print("hash " + Long.toHexString(hash()) + ",");
213 tty.print("age " + age() + ")");
214 }
215 }
|
34 import sun.jvm.hotspot.utilities.Observable;
35 import sun.jvm.hotspot.utilities.Observer;
36
37 public class Mark extends VMObject {
38 static {
39 VM.registerVMInitializedObserver(new Observer() {
40 public void update(Observable o, Object data) {
41 initialize(VM.getVM().getTypeDataBase());
42 }
43 });
44 }
45
46 private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
47 Type type = db.lookupType("oopDesc");
48 markField = type.getCIntegerField("_mark");
49
50 ageBits = db.lookupLongConstant("markWord::age_bits").longValue();
51 lockBits = db.lookupLongConstant("markWord::lock_bits").longValue();
52 maxHashBits = db.lookupLongConstant("markWord::max_hash_bits").longValue();
53 hashBits = db.lookupLongConstant("markWord::hash_bits").longValue();
54 hashCtrlBits = db.lookupLongConstant("markWord::hashctrl_bits").longValue();
55 lockShift = db.lookupLongConstant("markWord::lock_shift").longValue();
56 ageShift = db.lookupLongConstant("markWord::age_shift").longValue();
57 hashShift = db.lookupLongConstant("markWord::hash_shift").longValue();
58 hashCtrlShift = db.lookupLongConstant("markWord::hashctrl_shift").longValue();
59 if (VM.getVM().isLP64()) {
60 klassShift = db.lookupLongConstant("markWord::klass_shift").longValue();
61 }
62 lockMask = db.lookupLongConstant("markWord::lock_mask").longValue();
63 lockMaskInPlace = db.lookupLongConstant("markWord::lock_mask_in_place").longValue();
64 ageMask = db.lookupLongConstant("markWord::age_mask").longValue();
65 ageMaskInPlace = db.lookupLongConstant("markWord::age_mask_in_place").longValue();
66 hashMask = db.lookupLongConstant("markWord::hash_mask").longValue();
67 hashMaskInPlace = db.lookupLongConstant("markWord::hash_mask_in_place").longValue();
68 hashCtrlMask = db.lookupLongConstant("markWord::hashctrl_mask").longValue();
69 hashCtrlMaskInPlace = db.lookupLongConstant("markWord::hashctrl_mask_in_place").longValue();
70 hashCtrlHashedMaskInPlace = db.lookupLongConstant("markWord::hashctrl_hashed_mask_in_place").longValue();
71 hashCtrlExpandedMaskInPlace = db.lookupLongConstant("markWord::hashctrl_expanded_mask_in_place").longValue();
72 lockedValue = db.lookupLongConstant("markWord::locked_value").longValue();
73 unlockedValue = db.lookupLongConstant("markWord::unlocked_value").longValue();
74 monitorValue = db.lookupLongConstant("markWord::monitor_value").longValue();
75 markedValue = db.lookupLongConstant("markWord::marked_value").longValue();
76 noHash = db.lookupLongConstant("markWord::no_hash").longValue();
77 noHashInPlace = db.lookupLongConstant("markWord::no_hash_in_place").longValue();
78 noLockInPlace = db.lookupLongConstant("markWord::no_lock_in_place").longValue();
79 maxAge = db.lookupLongConstant("markWord::max_age").longValue();
80 }
81
82 // Field accessors
83 private static CIntegerField markField;
84
85 // Constants -- read from VM
86 private static long ageBits;
87 private static long lockBits;
88 private static long maxHashBits;
89 private static long hashBits;
90 private static long hashCtrlBits;
91
92 private static long lockShift;
93 private static long ageShift;
94 private static long hashShift;
95 private static long hashCtrlShift;
96 private static long klassShift;
97
98 private static long lockMask;
99 private static long lockMaskInPlace;
100 private static long ageMask;
101 private static long ageMaskInPlace;
102 private static long hashMask;
103 private static long hashMaskInPlace;
104 private static long hashCtrlMask;
105 private static long hashCtrlMaskInPlace;
106 private static long hashCtrlHashedMaskInPlace;
107 private static long hashCtrlExpandedMaskInPlace;
108
109 private static long lockedValue;
110 private static long unlockedValue;
111 private static long monitorValue;
112 private static long markedValue;
113
114 private static long noHash;
115
116 private static long noHashInPlace;
117 private static long noLockInPlace;
118
119 private static long maxAge;
120
121 public static long getKlassShift() {
122 return klassShift;
123 }
124
125 public Mark(Address addr) {
126 super(addr);
127 }
181 return null;
182 }
183 // Use xor instead of &~ to provide one extra tag-bit check.
184 Address monAddr = valueAsAddress().xorWithMask(monitorValue);
185 return new ObjectMonitor(monAddr);
186 }
187 public boolean hasDisplacedMarkHelper() {
188 return ((value() & unlockedValue) == 0);
189 }
190 public Mark displacedMarkHelper() {
191 if (Assert.ASSERTS_ENABLED) {
192 Assert.that(hasDisplacedMarkHelper(), "check");
193 }
194 Address addr = valueAsAddress().andWithMask(~monitorValue);
195 return new Mark(addr.getAddressAt(0));
196 }
197 public int age() { return (int) Bits.maskBitsLong(value() >> ageShift, ageMask); }
198
199 // hash operations
200 public long hash() {
201 if (VM.getVM().isCompactObjectHeadersEnabled()) {
202 System.exit(-23);
203 throw new RuntimeException("Compact I-Hash not yet implemented");
204 } else {
205 return Bits.maskBitsLong(value() >> hashShift, hashMask);
206 }
207 }
208
209 public boolean hasNoHash() {
210 return hash() == noHash;
211 }
212
213 public boolean isExpanded() {
214 assert(VM.getVM().isCompactObjectHeadersEnabled());
215 return Bits.maskBitsLong(value(), hashCtrlExpandedMaskInPlace) != 0;
216 }
217
218 public Klass getKlass() {
219 assert(VM.getVM().isCompactObjectHeadersEnabled());
220 return (Klass)Metadata.instantiateWrapperFor(addr.getCompKlassAddressAt(0));
221 }
222
223 // Debugging
224 public void printOn(PrintStream tty) {
225 if (isLocked()) {
226 tty.print("locked(0x" +
227 Long.toHexString(value()) + ")->");
228 displacedMarkHelper().printOn(tty);
229 } else {
230 if (Assert.ASSERTS_ENABLED) {
231 Assert.that(isUnlocked(), "just checking");
232 }
233 tty.print("mark(");
234 tty.print("hash " + Long.toHexString(hash()) + ",");
235 tty.print("age " + age() + ")");
236 }
237 }
|