Mercurial > hg > graal-jvmci-8
comparison agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java @ 702:b9fba36710f2
6699669: Hotspot server leaves synchronized block with monitor in bad state
Summary: Remove usage of _highest_lock field in Thread so that is_lock_owned won't depend on the correct update of that field.
Reviewed-by: never, dice, acorn
author | xlu |
---|---|
date | Mon, 06 Apr 2009 15:47:39 -0700 |
parents | a5838065ab24 |
children | f1f3a2719a55 |
comparison
equal
deleted
inserted
replaced
697:922aedc96ef5 | 702:b9fba36710f2 |
---|---|
46 private static AddressField anchorField; | 46 private static AddressField anchorField; |
47 private static AddressField lastJavaSPField; | 47 private static AddressField lastJavaSPField; |
48 private static AddressField lastJavaPCField; | 48 private static AddressField lastJavaPCField; |
49 private static CIntegerField threadStateField; | 49 private static CIntegerField threadStateField; |
50 private static AddressField osThreadField; | 50 private static AddressField osThreadField; |
51 private static AddressField stackBaseField; | |
52 private static CIntegerField stackSizeField; | |
51 | 53 |
52 private static JavaThreadPDAccess access; | 54 private static JavaThreadPDAccess access; |
53 | 55 |
54 // JavaThreadStates read from underlying process | 56 // JavaThreadStates read from underlying process |
55 private static int UNINITIALIZED; | 57 private static int UNINITIALIZED; |
81 anchorField = type.getAddressField("_anchor"); | 83 anchorField = type.getAddressField("_anchor"); |
82 lastJavaSPField = anchorType.getAddressField("_last_Java_sp"); | 84 lastJavaSPField = anchorType.getAddressField("_last_Java_sp"); |
83 lastJavaPCField = anchorType.getAddressField("_last_Java_pc"); | 85 lastJavaPCField = anchorType.getAddressField("_last_Java_pc"); |
84 threadStateField = type.getCIntegerField("_thread_state"); | 86 threadStateField = type.getCIntegerField("_thread_state"); |
85 osThreadField = type.getAddressField("_osthread"); | 87 osThreadField = type.getAddressField("_osthread"); |
88 stackBaseField = type.getAddressField("_stack_base"); | |
89 stackSizeField = type.getCIntegerField("_stack_size"); | |
86 | 90 |
87 UNINITIALIZED = db.lookupIntConstant("_thread_uninitialized").intValue(); | 91 UNINITIALIZED = db.lookupIntConstant("_thread_uninitialized").intValue(); |
88 NEW = db.lookupIntConstant("_thread_new").intValue(); | 92 NEW = db.lookupIntConstant("_thread_new").intValue(); |
89 NEW_TRANS = db.lookupIntConstant("_thread_new_trans").intValue(); | 93 NEW_TRANS = db.lookupIntConstant("_thread_new_trans").intValue(); |
90 IN_NATIVE = db.lookupIntConstant("_thread_in_native").intValue(); | 94 IN_NATIVE = db.lookupIntConstant("_thread_in_native").intValue(); |
310 | 314 |
311 public OSThread getOSThread() { | 315 public OSThread getOSThread() { |
312 return (OSThread) VMObjectFactory.newObject(OSThread.class, osThreadField.getValue(addr)); | 316 return (OSThread) VMObjectFactory.newObject(OSThread.class, osThreadField.getValue(addr)); |
313 } | 317 } |
314 | 318 |
319 public Address getStackBase() { | |
320 return stackBaseField.getValue(); | |
321 } | |
322 | |
323 public long getStackSize() { | |
324 return stackSizeField.getValue(); | |
325 } | |
326 | |
315 /** Gets the Java-side thread object for this JavaThread */ | 327 /** Gets the Java-side thread object for this JavaThread */ |
316 public Oop getThreadObj() { | 328 public Oop getThreadObj() { |
317 return VM.getVM().getObjectHeap().newOop(threadObjField.getValue(addr)); | 329 return VM.getVM().getObjectHeap().newOop(threadObjField.getValue(addr)); |
318 } | 330 } |
319 | 331 |
343 | 355 |
344 public boolean isInStack(Address a) { | 356 public boolean isInStack(Address a) { |
345 if (Assert.ASSERTS_ENABLED) { | 357 if (Assert.ASSERTS_ENABLED) { |
346 Assert.that(VM.getVM().isDebugging(), "Not yet implemented for non-debugging system"); | 358 Assert.that(VM.getVM().isDebugging(), "Not yet implemented for non-debugging system"); |
347 } | 359 } |
348 Address highest = highestLock(); | |
349 Address sp = lastSPDbg(); | 360 Address sp = lastSPDbg(); |
361 Address stackBase = getStackBase(); | |
350 // Be robust | 362 // Be robust |
351 if ((highest == null) || (sp == null)) return false; | 363 if (sp == null) return false; |
352 return (highest.greaterThanOrEqual(a) && sp.lessThanOrEqual(a)); | 364 return stackBase.greaterThanOrEqual(a) && sp.lessThanOrEqual(a); |
365 } | |
366 | |
367 public boolean isLockOwned(Address a) { | |
368 Address stackBase = getStackBase(); | |
369 Address stackLimit = stackBase.addOffsetTo(-getStackSize()); | |
370 | |
371 return stackBase.greaterThanOrEqual(a) && stackLimit.lessThanOrEqual(a); | |
353 | 372 |
354 // FIXME: should traverse MonitorArray/MonitorChunks as in VM | 373 // FIXME: should traverse MonitorArray/MonitorChunks as in VM |
355 } | 374 } |
356 | 375 |
357 public Oop getCurrentParkBlocker() { | 376 public Oop getCurrentParkBlocker() { |