aboutsummaryrefslogtreecommitdiff
path: root/agent
diff options
context:
space:
mode:
authorxlu <none@none>2009-04-06 15:47:39 -0700
committerxlu <none@none>2009-04-06 15:47:39 -0700
commit2818e502d64087adb9ff24951a90c22c9518310d (patch)
tree084035851b978ae8e73a7f09fbc7df060bf60142 /agent
parentf26de6bdd01a4b3208e4e99b3dbd0592e55d18c0 (diff)
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
Diffstat (limited to 'agent')
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java25
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/runtime/Thread.java6
-rw-r--r--agent/src/share/classes/sun/jvm/hotspot/runtime/Threads.java15
3 files changed, 25 insertions, 21 deletions
diff --git a/agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java b/agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java
index 204156c3f..d3622b050 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java
@@ -48,6 +48,8 @@ public class JavaThread extends Thread {
private static AddressField lastJavaPCField;
private static CIntegerField threadStateField;
private static AddressField osThreadField;
+ private static AddressField stackBaseField;
+ private static CIntegerField stackSizeField;
private static JavaThreadPDAccess access;
@@ -83,6 +85,8 @@ public class JavaThread extends Thread {
lastJavaPCField = anchorType.getAddressField("_last_Java_pc");
threadStateField = type.getCIntegerField("_thread_state");
osThreadField = type.getAddressField("_osthread");
+ stackBaseField = type.getAddressField("_stack_base");
+ stackSizeField = type.getCIntegerField("_stack_size");
UNINITIALIZED = db.lookupIntConstant("_thread_uninitialized").intValue();
NEW = db.lookupIntConstant("_thread_new").intValue();
@@ -312,6 +316,14 @@ public class JavaThread extends Thread {
return (OSThread) VMObjectFactory.newObject(OSThread.class, osThreadField.getValue(addr));
}
+ public Address getStackBase() {
+ return stackBaseField.getValue();
+ }
+
+ public long getStackSize() {
+ return stackSizeField.getValue();
+ }
+
/** Gets the Java-side thread object for this JavaThread */
public Oop getThreadObj() {
return VM.getVM().getObjectHeap().newOop(threadObjField.getValue(addr));
@@ -345,11 +357,18 @@ public class JavaThread extends Thread {
if (Assert.ASSERTS_ENABLED) {
Assert.that(VM.getVM().isDebugging(), "Not yet implemented for non-debugging system");
}
- Address highest = highestLock();
Address sp = lastSPDbg();
+ Address stackBase = getStackBase();
// Be robust
- if ((highest == null) || (sp == null)) return false;
- return (highest.greaterThanOrEqual(a) && sp.lessThanOrEqual(a));
+ if (sp == null) return false;
+ return stackBase.greaterThanOrEqual(a) && sp.lessThanOrEqual(a);
+ }
+
+ public boolean isLockOwned(Address a) {
+ Address stackBase = getStackBase();
+ Address stackLimit = stackBase.addOffsetTo(-getStackSize());
+
+ return stackBase.greaterThanOrEqual(a) && stackLimit.lessThanOrEqual(a);
// FIXME: should traverse MonitorArray/MonitorChunks as in VM
}
diff --git a/agent/src/share/classes/sun/jvm/hotspot/runtime/Thread.java b/agent/src/share/classes/sun/jvm/hotspot/runtime/Thread.java
index 2b28e9fb9..9ca93b931 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/runtime/Thread.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/runtime/Thread.java
@@ -38,7 +38,6 @@ public class Thread extends VMObject {
private static int HAS_ASYNC_EXCEPTION;
private static AddressField activeHandlesField;
- private static AddressField highestLockField;
private static AddressField currentPendingMonitorField;
private static AddressField currentWaitingMonitorField;
@@ -60,7 +59,6 @@ public class Thread extends VMObject {
tlabFieldOffset = type.getField("_tlab").getOffset();
activeHandlesField = type.getAddressField("_active_handles");
- highestLockField = type.getAddressField("_highest_lock");
currentPendingMonitorField = type.getAddressField("_current_pending_monitor");
currentWaitingMonitorField = type.getAddressField("_current_waiting_monitor");
}
@@ -121,10 +119,6 @@ public class Thread extends VMObject {
// pending exception
}
- public Address highestLock() {
- return highestLockField.getValue(addr);
- }
-
public ObjectMonitor getCurrentPendingMonitor() {
Address monitorAddr = currentPendingMonitorField.getValue(addr);
if (monitorAddr == null) {
diff --git a/agent/src/share/classes/sun/jvm/hotspot/runtime/Threads.java b/agent/src/share/classes/sun/jvm/hotspot/runtime/Threads.java
index 1f7c9a1af..9be499b5b 100644
--- a/agent/src/share/classes/sun/jvm/hotspot/runtime/Threads.java
+++ b/agent/src/share/classes/sun/jvm/hotspot/runtime/Threads.java
@@ -164,20 +164,11 @@ public class Threads {
}
}
- long leastDiff = 0;
- boolean leastDiffInitialized = false;
- JavaThread theOwner = null;
for (JavaThread thread = first(); thread != null; thread = thread.next()) {
- Address addr = thread.highestLock();
- if (addr == null || addr.lessThan(o)) continue;
- long diff = addr.minus(o);
- if (!leastDiffInitialized || diff < leastDiff) {
- leastDiffInitialized = true;
- leastDiff = diff;
- theOwner = thread;
- }
+ if (thread.isLockOwned(o))
+ return thread;
}
- return theOwner;
+ return null;
}
public JavaThread owningThreadFromMonitor(ObjectMonitor monitor) {