# HG changeset patch # User ysuenaga # Date 1543576525 -32400 # Node ID be588be89f687da5adbc8134088efb1cf50208db # Parent a432469d2ed5b8033692dcd225537c7b3209109c 8214499: SA should follow 8150689 Reviewed-by: dholmes, jgeorge diff -r a432469d2ed5 -r be588be89f68 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/OopUtilities.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/OopUtilities.java Tue Nov 27 08:44:19 2018 +0100 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/OopUtilities.java Fri Nov 30 20:15:25 2018 +0900 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -63,16 +63,16 @@ private static BooleanField threadDaemonField; // possible values of java_lang_Thread::ThreadStatus - private static int THREAD_STATUS_NEW; + public static int THREAD_STATUS_NEW; - private static int THREAD_STATUS_RUNNABLE; - private static int THREAD_STATUS_SLEEPING; - private static int THREAD_STATUS_IN_OBJECT_WAIT; - private static int THREAD_STATUS_IN_OBJECT_WAIT_TIMED; - private static int THREAD_STATUS_PARKED; - private static int THREAD_STATUS_PARKED_TIMED; - private static int THREAD_STATUS_BLOCKED_ON_MONITOR_ENTER; - private static int THREAD_STATUS_TERMINATED; + public static int THREAD_STATUS_RUNNABLE; + public static int THREAD_STATUS_SLEEPING; + public static int THREAD_STATUS_IN_OBJECT_WAIT; + public static int THREAD_STATUS_IN_OBJECT_WAIT_TIMED; + public static int THREAD_STATUS_PARKED; + public static int THREAD_STATUS_PARKED_TIMED; + public static int THREAD_STATUS_BLOCKED_ON_MONITOR_ENTER; + public static int THREAD_STATUS_TERMINATED; // java.util.concurrent.locks.AbstractOwnableSynchronizer fields private static OopField absOwnSyncOwnerThreadField; diff -r a432469d2ed5 -r be588be89f68 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/JavaVFrame.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/JavaVFrame.java Tue Nov 27 08:44:19 2018 +0100 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/JavaVFrame.java Fri Nov 30 20:15:25 2018 +0900 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -99,13 +99,14 @@ // we are still waiting for notification or timeout. Otherwise if // we earlier reported java.lang.Thread.State == "BLOCKED (on object // monitor)", then we are actually waiting to re-lock the monitor. - // At this level we can't distinguish the two cases to report - // "waited on" rather than "waiting on" for the second case. StackValueCollection locs = getLocals(); if (!locs.isEmpty()) { StackValue sv = locs.get(0); if (sv.getType() == BasicType.getTObject()) { OopHandle o = sv.getObject(); + if (OopUtilities.threadOopGetThreadStatus(thread.getThreadObj()) == OopUtilities.THREAD_STATUS_BLOCKED_ON_MONITOR_ENTER) { + waitState = "waiting to re-lock in wait()"; + } printLockedObjectClassName(tty, o, waitState); } } else { @@ -146,13 +147,6 @@ // an inflated monitor that is first on the monitor list in // the first frame can block us on a monitor enter. lockState = identifyLockState(monitor, "waiting to lock"); - } else if (frameCount != 0) { - // This is not the first frame so we either own this monitor - // or we owned the monitor before and called wait(). Because - // wait() could have been called on any monitor in a lower - // numbered frame on the stack, we have to check all the - // monitors on the list for this frame. - lockState = identifyLockState(monitor, "waiting to re-lock in wait()"); } printLockedObjectClassName(tty, monitor.owner(), lockState); foundFirstMonitor = true;