Hi Yasumasa,
http://cr.openjdk.java.net/~ysuenaga/JDK-8185796/webrev.04/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/java_lang_Class.java.udiff.html + public static String asExternalName(Oop aClass) { + Klass k = java_lang_Class.asKlass(aClass); + if (k == null) { // primitive + BasicType type = BasicType.T_VOID; + ArrayKlass ak = (ArrayKlass)Metadata.instantiateWrapperFor( + aClass.getHandle().getAddressAt(arrayKlassOffset)); + if (ak != null) { + type = BasicType.intToBasicType(ak.getElementType()); + }If I understand correctly, it is array of a primitive type, not a primitive. The comment needs to be updated accordingly. http://cr.openjdk.java.net/~ysuenaga/JDK-8185796/webrev.04/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/BasicType.java.udiff.html It looks like the change is a little bit more complex than necessary. It could be enough to just introduce new method getName() like this: public String getName() { String name = "ILLEGAL TYPE"; switch (type) { case tBoolean: name = "boolean"; . . . } return name; } http://cr.openjdk.java.net/~ysuenaga/JDK-8185796/webrev.04/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/JavaVFrame.java.udiff.html The logic in the printLockInfo() is unclear because there are two almost identical fragments here: + if (monitor.owner() != null) { + // the monitor is associated with an object, i.e., it is locked + + Mark mark = null; + String lockState = "locked"; + if (!foundFirstMonitor && frameCount == 0) { + // If this is the first frame and we haven't found an owned + // monitor before, then we need to see if we have completed + // the lock or if we are blocked trying to acquire it. Only + // an inflated monitor that is first on the monitor list in + // the first frame can block us on a monitor enter. + mark = new Mark(monitor.owner()); + if (mark.hasMonitor() && + ( // we have marked ourself as pending on this monitor + mark.monitor().equals(thread.getCurrentPendingMonitor()) || + // we are not the owner of this monitor + !mark.monitor().isEntered(thread) + )) { + lockState = "waiting to lock"; + } else { + // We own the monitor which is not as interesting so + // disable the extra printing below. + mark = null; + } + } 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. + mark = new Mark(monitor.owner()); + if (mark.hasMonitor() && + ( // we have marked ourself as pending on this monitor + mark.monitor().equals(thread.getCurrentPendingMonitor()) || + // we are not the owner of this monitor + !mark.monitor().isEntered(thread) + )) { + lockState = "waiting to re-lock in wait()"; + } else { + // We own the monitor which is not as interesting so + // disable the extra printing below. + mark = null; + } + } + printLockedObjectClassName(tty, monitor.owner(), lockState); + foundFirstMonitor = true; A way to simplify this part would be to add a method like this: String identifyLockState(String waitingState) { Mark mark = new Mark(monitor.owner()); String lockState = "locked"; if (mark.hasMonitor() && ( // we have marked ourself as pending on this monitor mark.monitor().equals(thread.getCurrentPendingMonitor()) || // we are not the owner of this monitor !mark.monitor().isEntered(thread) )) { lockState = waitingState; } return lockState; } Then the fragment above could be reduced to: if (monitor.owner() != null) { // the monitor is associated with an object, i.e., it is locked String lockState = "locked"; if (!foundFirstMonitor && frameCount == 0) { lockState = identifyLockState("waiting to lock"); } else if (frameCount != 0) { lockState = identifyLockState("waiting to re-lock in wait()"); } printLockedObjectClassName(tty, monitor.owner(), lockState); foundFirstMonitor = true; } http://cr.openjdk.java.net/~ysuenaga/JDK-8185796/webrev.04/test/hotspot/jtreg/serviceability/sa/LingeredAppWithLock.java.html The indent is inconsistent, the lines 29-37 have 2 instead of 4. 30 synchronized(lock) {Space is missed before '('. 40 Thread classLock1 = new Thread( 41 () -> lockMethod(LingeredAppWithLock.class)); 42 Thread classLock2 = new Thread( 43 () -> lockMethod(LingeredAppWithLock.class)); 44 Thread objectLock = new Thread(() -> lockMethod(classLock1)); 45 Thread primitiveLock = new Thread(() -> lockMethod(int.class));No need to separate lines at 40-43. http://cr.openjdk.java.net/~ysuenaga/JDK-8185796/webrev.04/test/hotspot/jtreg/serviceability/sa/TestClhsdbJstackLock.java.html Indent 3 instead of 4 in the fragment 97-101. No need to to split the lines: 114 System.out.println( 115 pb.command().stream().collect(Collectors.joining(" "))); . . . 156 System.out.println( 157 "SA attach not expected to work - test skipped."); http://cr.openjdk.java.net/~ysuenaga/JDK-8185796/webrev.04/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLock.java.html 49 System.out.println( 50 "SA attach not expected to work - test skipped.");No need to split the line above. On 11/19/17 05:37, Yasumasa Suenaga wrote: PING: Jini, could you, take care about this sponsorship? Thanks, Serguei Yasumasa |
- PING: RFR: 8185796: jstack and clhsdb jstack sh... Yasumasa Suenaga
- Re: PING: RFR: 8185796: jstack and clhsdb ... Yasumasa Suenaga
- Re: PING: RFR: 8185796: jstack and clh... serguei.spit...@oracle.com
- Re: PING: RFR: 8185796: jstack and... Yasumasa Suenaga
- Re: PING: RFR: 8185796: jstack... Jini George
- Re: PING: RFR: 8185796: j... serguei.spit...@oracle.com