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() {