1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
/* * @(#)MonitorInfo.java 1.5 06/05/05 * * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package java.lang.management; import javax.management.openmbean.CompositeData; import sun.management.MonitorInfoCompositeData; /** * Information about an object monitor lock. An object monitor is locked * when entering a synchronization block or method on that object. * * <h4>MXBean Mapping</h4> * <tt>MonitorInfo</tt> is mapped to a {@link CompositeData CompositeData} * with attributes as specified in * the {@link #from from} method. * * @author Mandy Chung * @version 1.5, 05/05/06 * @since 1.6 */ public class MonitorInfo extends LockInfo { private int stackDepth; private StackTraceElement stackFrame; /** * Construct a <tt>MonitorInfo</tt> object. * * @param className the fully qualified name of the class of the lock object. * @param identityHashCode the {@link System#identityHashCode * identity hash code} of the lock object. * @param stackDepth the depth in the stack trace where the object monitor * was locked. * @param stackFrame the stack frame that locked the object monitor. * @throws IllegalArgumentException if * <tt>stackDepth</tt> ≥ 0 but <tt>stackFrame</tt> is <tt>null</tt>, * or <tt>stackDepth</tt> < 0 but <tt>stackFrame</tt> is not * <tt>null</tt>. */ public MonitorInfo(String className, int identityHashCode, int stackDepth, StackTraceElement stackFrame) { super(className, identityHashCode); if (stackDepth >= 0 && stackFrame == null) { throw new IllegalArgumentException("Parameter stackDepth is " + stackDepth + " but stackFrame is null"); } if (stackDepth < 0 && stackFrame != null) { throw new IllegalArgumentException("Parameter stackDepth is " + stackDepth + " but stackFrame is not null"); } this.stackDepth = stackDepth; this.stackFrame = stackFrame; } /** * Returns the depth in the stack trace where the object monitor * was locked. The depth is the index to the <tt>StackTraceElement</tt> * array returned in the {@link ThreadInfo#getStackTrace} method. * * @return the depth in the stack trace where the object monitor * was locked, or a negative number if not available. */ public int getLockedStackDepth() { return stackDepth; } /** * Returns the stack frame that locked the object monitor. * * @return <tt>StackTraceElement</tt> that locked the object monitor, * or <tt>null</tt> if not available. */ public StackTraceElement getLockedStackFrame() { return stackFrame; } /** * Returns a <tt>MonitorInfo</tt> object represented by the * given <tt>CompositeData</tt>. * The given <tt>CompositeData</tt> must contain the following attributes * as well as the attributes specified in the * <a href="LockInfo.html#MappedType"> * mapped type</a> for the {@link LockInfo} class: * <blockquote> * <table border> * <tr> * <th align=left>Attribute Name</th> * <th align=left>Type</th> * </tr> * <tr> * <td>lockedStackFrame</td> * <td><tt>CompositeData as specified in the * <a href="ThreadInfo.html#StackTrace">stackTrace</a> * attribute defined in the {@link ThreadInfo#from * ThreadInfo.from} method. * </tt></td> * </tr> * <tr> * <td>lockedStackDepth</td> * <td><tt>java.lang.Integer</tt></td> * </tr> * </table> * </blockquote> * * @param cd <tt>CompositeData</tt> representing a <tt>MonitorInfo</tt> * * @throws IllegalArgumentException if <tt>cd</tt> does not * represent a <tt>MonitorInfo</tt> with the attributes described * above. * @return a <tt>MonitorInfo</tt> object represented * by <tt>cd</tt> if <tt>cd</tt> is not <tt>null</tt>; * <tt>null</tt> otherwise. */ public static MonitorInfo from(CompositeData cd) { if (cd == null) { return null; } if (cd instanceof MonitorInfoCompositeData) { return ((MonitorInfoCompositeData) cd).getMonitorInfo(); } else { MonitorInfoCompositeData.validateCompositeData(cd); String className = MonitorInfoCompositeData.getClassName(cd); int identityHashCode = MonitorInfoCompositeData.getIdentityHashCode(cd); int stackDepth = MonitorInfoCompositeData.getLockedStackDepth(cd); StackTraceElement stackFrame = MonitorInfoCompositeData.getLockedStackFrame(cd); return new MonitorInfo(className, identityHashCode, stackDepth, stackFrame); } } }