mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-16 21:35:25 +00:00
7193302: Remove ConstructorProperties annotation from java.lang.management.LockInfo
Reviewed-by: alanb, sla, egahlin
This commit is contained in:
parent
478bf4b32a
commit
c6064021fd
@ -27,7 +27,7 @@ package java.lang.management;
|
||||
|
||||
import javax.management.openmbean.CompositeData;
|
||||
import java.util.concurrent.locks.*;
|
||||
import java.beans.ConstructorProperties;
|
||||
import sun.management.LockInfoCompositeData;
|
||||
|
||||
/**
|
||||
* Information about a <em>lock</em>. A lock can be a built-in object monitor,
|
||||
@ -44,8 +44,7 @@ import java.beans.ConstructorProperties;
|
||||
*
|
||||
* <h4><a name="MappedType">MXBean Mapping</a></h4>
|
||||
* <tt>LockInfo</tt> is mapped to a {@link CompositeData CompositeData}
|
||||
* as specified in the <a href="../../../javax/management/MXBean.html#mapping-rules">
|
||||
* type mapping rules</a> of {@linkplain javax.management.MXBean MXBeans}.
|
||||
* as specified in the {@link #from from} method.
|
||||
*
|
||||
* @see java.util.concurrent.locks.AbstractOwnableSynchronizer
|
||||
* @see java.util.concurrent.locks.Condition
|
||||
@ -66,7 +65,6 @@ public class LockInfo {
|
||||
* @param identityHashCode the {@link System#identityHashCode
|
||||
* identity hash code} of the lock object.
|
||||
*/
|
||||
@ConstructorProperties({"className", "identityHashCode"})
|
||||
public LockInfo(String className, int identityHashCode) {
|
||||
if (className == null) {
|
||||
throw new NullPointerException("Parameter className cannot be null");
|
||||
@ -102,6 +100,50 @@ public class LockInfo {
|
||||
return identityHashCode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a {@code LockInfo} object represented by the
|
||||
* given {@code CompositeData}.
|
||||
* The given {@code CompositeData} must contain the following attributes:
|
||||
* <blockquote>
|
||||
* <table border>
|
||||
* <tr>
|
||||
* <th align=left>Attribute Name</th>
|
||||
* <th align=left>Type</th>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>className</td>
|
||||
* <td><tt>java.lang.String</tt></td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>identityHashCode</td>
|
||||
* <td><tt>java.lang.Integer</tt></td>
|
||||
* </tr>
|
||||
* </table>
|
||||
* </blockquote>
|
||||
*
|
||||
* @param cd {@code CompositeData} representing a {@code LockInfo}
|
||||
*
|
||||
* @throws IllegalArgumentException if {@code cd} does not
|
||||
* represent a {@code LockInfo} with the attributes described
|
||||
* above.
|
||||
* @return a {@code LockInfo} object represented
|
||||
* by {@code cd} if {@code cd} is not {@code null};
|
||||
* {@code null} otherwise.
|
||||
*
|
||||
* @since 1.8
|
||||
*/
|
||||
public static LockInfo from(CompositeData cd) {
|
||||
if (cd == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (cd instanceof LockInfoCompositeData) {
|
||||
return ((LockInfoCompositeData) cd).getLockInfo();
|
||||
} else {
|
||||
return LockInfoCompositeData.toLockInfo(cd);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of a lock. The returned
|
||||
* string representation consists of the name of the class of the
|
||||
|
||||
@ -696,9 +696,7 @@ public class ThreadInfo {
|
||||
* <td>lockInfo</td>
|
||||
* <td><tt>javax.management.openmbean.CompositeData</tt>
|
||||
* - the mapped type for {@link LockInfo} as specified in the
|
||||
* <a href="../../../javax/management/MXBean.html#mapping-rules">
|
||||
* type mapping rules</a> of
|
||||
* {@linkplain javax.management.MXBean MXBeans}.
|
||||
* {@link LockInfo#from} method.
|
||||
* <p>
|
||||
* If <tt>cd</tt> does not contain this attribute,
|
||||
* the <tt>LockInfo</tt> object will be constructed from
|
||||
@ -766,10 +764,7 @@ public class ThreadInfo {
|
||||
* <td>lockedSynchronizers</td>
|
||||
* <td><tt>javax.management.openmbean.CompositeData[]</tt>
|
||||
* whose element type is the mapped type for
|
||||
* {@link LockInfo} as specified in the
|
||||
* <a href="../../../javax/management/MXBean.html#mapping-rules">
|
||||
* type mapping rules</a> of
|
||||
* {@linkplain javax.management.MXBean MXBeans}.
|
||||
* {@link LockInfo} as specified in the {@link LockInfo#from} method.
|
||||
* <p>
|
||||
* If <tt>cd</tt> does not contain this attribute,
|
||||
* this attribute will be set to an empty array. </td>
|
||||
@ -830,7 +825,6 @@ public class ThreadInfo {
|
||||
* @since 1.6
|
||||
*/
|
||||
public LockInfo[] getLockedSynchronizers() {
|
||||
// represents an <a href="LockInfo.html#OwnableSynchronizer">
|
||||
return lockedSynchronizers;
|
||||
}
|
||||
|
||||
|
||||
@ -1,111 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2008, 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
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package sun.management;
|
||||
|
||||
import java.lang.management.LockInfo;
|
||||
import java.lang.management.ThreadInfo;
|
||||
import javax.management.Attribute;
|
||||
import javax.management.StandardMBean;
|
||||
import javax.management.openmbean.CompositeData;
|
||||
|
||||
/**
|
||||
* This MXBean is used for data conversion from LockInfo
|
||||
* to CompositeData (its mapped type) or vice versa.
|
||||
*/
|
||||
class LockDataConverter extends StandardMBean
|
||||
implements LockDataConverterMXBean {
|
||||
private LockInfo lockInfo;
|
||||
private LockInfo[] lockedSyncs;
|
||||
|
||||
LockDataConverter() {
|
||||
super(LockDataConverterMXBean.class, true);
|
||||
this.lockInfo = null;
|
||||
this.lockedSyncs = null;
|
||||
}
|
||||
|
||||
LockDataConverter(ThreadInfo ti) {
|
||||
super(LockDataConverterMXBean.class, true);
|
||||
this.lockInfo = ti.getLockInfo();
|
||||
this.lockedSyncs = ti.getLockedSynchronizers();
|
||||
}
|
||||
|
||||
public void setLockInfo(LockInfo l) {
|
||||
this.lockInfo = l;
|
||||
}
|
||||
|
||||
public LockInfo getLockInfo() {
|
||||
return this.lockInfo;
|
||||
}
|
||||
|
||||
public void setLockedSynchronizers(LockInfo[] l) {
|
||||
this.lockedSyncs = l;
|
||||
}
|
||||
|
||||
public LockInfo[] getLockedSynchronizers() {
|
||||
return this.lockedSyncs;
|
||||
}
|
||||
|
||||
// helper methods
|
||||
CompositeData toLockInfoCompositeData() {
|
||||
try {
|
||||
return (CompositeData) getAttribute("LockInfo");
|
||||
} catch (Exception e) {
|
||||
throw new AssertionError(e);
|
||||
}
|
||||
}
|
||||
|
||||
CompositeData[] toLockedSynchronizersCompositeData() {
|
||||
try {
|
||||
return (CompositeData[]) getAttribute("LockedSynchronizers");
|
||||
} catch (Exception e) {
|
||||
throw new AssertionError(e);
|
||||
}
|
||||
}
|
||||
|
||||
LockInfo toLockInfo(CompositeData cd) {
|
||||
try {
|
||||
setAttribute(new Attribute("LockInfo", cd));
|
||||
} catch (Exception e) {
|
||||
throw new AssertionError(e);
|
||||
}
|
||||
return getLockInfo();
|
||||
}
|
||||
|
||||
LockInfo[] toLockedSynchronizers(CompositeData[] cd) {
|
||||
try {
|
||||
setAttribute(new Attribute("LockedSynchronizers", cd));
|
||||
} catch (Exception e) {
|
||||
throw new AssertionError(e);
|
||||
}
|
||||
return getLockedSynchronizers();
|
||||
}
|
||||
|
||||
static CompositeData toLockInfoCompositeData(LockInfo l) {
|
||||
LockDataConverter ldc = new LockDataConverter();
|
||||
ldc.setLockInfo(l);
|
||||
return ldc.toLockInfoCompositeData();
|
||||
}
|
||||
}
|
||||
@ -1,40 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 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
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package sun.management;
|
||||
|
||||
import java.lang.management.LockInfo;
|
||||
|
||||
/**
|
||||
* This interface is used for data conversion from LockInfo
|
||||
* to CompositeData (its mapped type) or vice versa.
|
||||
*/
|
||||
public interface LockDataConverterMXBean {
|
||||
public void setLockInfo(LockInfo l);
|
||||
public LockInfo getLockInfo();
|
||||
|
||||
public void setLockedSynchronizers(LockInfo[] l);
|
||||
public LockInfo[] getLockedSynchronizers();
|
||||
}
|
||||
118
jdk/src/share/classes/sun/management/LockInfoCompositeData.java
Normal file
118
jdk/src/share/classes/sun/management/LockInfoCompositeData.java
Normal file
@ -0,0 +1,118 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 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
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package sun.management;
|
||||
|
||||
import java.lang.management.LockInfo;
|
||||
import javax.management.openmbean.CompositeType;
|
||||
import javax.management.openmbean.CompositeData;
|
||||
import javax.management.openmbean.CompositeDataSupport;
|
||||
import javax.management.openmbean.OpenDataException;
|
||||
|
||||
/**
|
||||
* A CompositeData for LockInfo for the local management support.
|
||||
* This class avoids the performance penalty paid to the
|
||||
* construction of a CompositeData use in the local case.
|
||||
*/
|
||||
public class LockInfoCompositeData extends LazyCompositeData {
|
||||
private final LockInfo lock;
|
||||
|
||||
private LockInfoCompositeData(LockInfo li) {
|
||||
this.lock = li;
|
||||
}
|
||||
|
||||
public LockInfo getLockInfo() {
|
||||
return lock;
|
||||
}
|
||||
|
||||
public static CompositeData toCompositeData(LockInfo li) {
|
||||
if (li == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
LockInfoCompositeData licd = new LockInfoCompositeData(li);
|
||||
return licd.getCompositeData();
|
||||
}
|
||||
|
||||
protected CompositeData getCompositeData() {
|
||||
// CONTENTS OF THIS ARRAY MUST BE SYNCHRONIZED WITH
|
||||
// lockInfoItemNames!
|
||||
final Object[] lockInfoItemValues = {
|
||||
new String(lock.getClassName()),
|
||||
new Integer(lock.getIdentityHashCode()),
|
||||
};
|
||||
|
||||
try {
|
||||
return new CompositeDataSupport(lockInfoCompositeType,
|
||||
lockInfoItemNames,
|
||||
lockInfoItemValues);
|
||||
} catch (OpenDataException e) {
|
||||
// Should never reach here
|
||||
throw Util.newException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private static final CompositeType lockInfoCompositeType;
|
||||
static {
|
||||
try {
|
||||
lockInfoCompositeType = (CompositeType)
|
||||
MappedMXBeanType.toOpenType(LockInfo.class);
|
||||
} catch (OpenDataException e) {
|
||||
// Should never reach here
|
||||
throw Util.newException(e);
|
||||
}
|
||||
}
|
||||
|
||||
static CompositeType getLockInfoCompositeType() {
|
||||
return lockInfoCompositeType;
|
||||
}
|
||||
|
||||
private static final String CLASS_NAME = "className";
|
||||
private static final String IDENTITY_HASH_CODE = "identityHashCode";
|
||||
private static final String[] lockInfoItemNames = {
|
||||
CLASS_NAME,
|
||||
IDENTITY_HASH_CODE,
|
||||
};
|
||||
|
||||
/*
|
||||
* Returns a LockInfo object mapped from the given CompositeData.
|
||||
*/
|
||||
public static LockInfo toLockInfo(CompositeData cd) {
|
||||
if (cd == null) {
|
||||
throw new NullPointerException("Null CompositeData");
|
||||
}
|
||||
|
||||
if (!isTypeMatched(lockInfoCompositeType, cd.getCompositeType())) {
|
||||
throw new IllegalArgumentException(
|
||||
"Unexpected composite type for LockInfo");
|
||||
}
|
||||
|
||||
String className = getString(cd, CLASS_NAME);
|
||||
int identityHashCode = getInt(cd, IDENTITY_HASH_CODE);
|
||||
return new LockInfo(className, identityHashCode);
|
||||
}
|
||||
|
||||
private static final long serialVersionUID = -6374759159749014052L;
|
||||
}
|
||||
@ -703,7 +703,7 @@ public abstract class MappedMXBeanType {
|
||||
if (data instanceof java.lang.management.MonitorInfo) {
|
||||
return MonitorInfoCompositeData.toCompositeData((MonitorInfo) data);
|
||||
}
|
||||
return LockDataConverter.toLockInfoCompositeData((LockInfo) data);
|
||||
return LockInfoCompositeData.toCompositeData((LockInfo) data);
|
||||
}
|
||||
|
||||
if (data instanceof MemoryNotificationInfo) {
|
||||
|
||||
@ -59,7 +59,7 @@ public class MonitorInfoCompositeData extends LazyCompositeData {
|
||||
|
||||
int len = monitorInfoItemNames.length;
|
||||
Object[] values = new Object[len];
|
||||
CompositeData li = LockDataConverter.toLockInfoCompositeData(lock);
|
||||
CompositeData li = LockInfoCompositeData.toCompositeData(lock);
|
||||
|
||||
for (int i = 0; i < len; i++) {
|
||||
String item = monitorInfoItemNames[i];
|
||||
|
||||
@ -85,11 +85,18 @@ public class ThreadInfoCompositeData extends LazyCompositeData {
|
||||
}
|
||||
|
||||
// Convert MonitorInfo[] and LockInfo[] to CompositeData[]
|
||||
LockDataConverter converter = new LockDataConverter(threadInfo);
|
||||
CompositeData lockInfoData = converter.toLockInfoCompositeData();
|
||||
CompositeData[] lockedSyncsData = converter.toLockedSynchronizersCompositeData();
|
||||
CompositeData lockInfoData =
|
||||
LockInfoCompositeData.toCompositeData(threadInfo.getLockInfo());
|
||||
|
||||
// Convert LockInfo[] and MonitorInfo[] to CompositeData[]
|
||||
LockInfo[] lockedSyncs = threadInfo.getLockedSynchronizers();
|
||||
CompositeData[] lockedSyncsData =
|
||||
new CompositeData[lockedSyncs.length];
|
||||
for (int i = 0; i < lockedSyncs.length; i++) {
|
||||
LockInfo li = lockedSyncs[i];
|
||||
lockedSyncsData[i] = LockInfoCompositeData.toCompositeData(li);
|
||||
}
|
||||
|
||||
// Convert MonitorInfo[] to CompositeData[]
|
||||
MonitorInfo[] lockedMonitors = threadInfo.getLockedMonitors();
|
||||
CompositeData[] lockedMonitorsData =
|
||||
new CompositeData[lockedMonitors.length];
|
||||
@ -98,7 +105,6 @@ public class ThreadInfoCompositeData extends LazyCompositeData {
|
||||
lockedMonitorsData[i] = MonitorInfoCompositeData.toCompositeData(mi);
|
||||
}
|
||||
|
||||
|
||||
// CONTENTS OF THIS ARRAY MUST BE SYNCHRONIZED WITH
|
||||
// threadInfoItemNames!
|
||||
final Object[] threadInfoItemValues = {
|
||||
@ -216,11 +222,11 @@ public class ThreadInfoCompositeData extends LazyCompositeData {
|
||||
// with it. So we can get the CompositeType representing LockInfo
|
||||
// from a mapped CompositeData for any LockInfo object.
|
||||
// Thus we construct a random LockInfo object and pass it
|
||||
// to LockDataConverter to do the conversion.
|
||||
// to LockInfoCompositeData to do the conversion.
|
||||
Object o = new Object();
|
||||
LockInfo li = new LockInfo(o.getClass().getName(),
|
||||
System.identityHashCode(o));
|
||||
CompositeData cd = LockDataConverter.toLockInfoCompositeData(li);
|
||||
CompositeData cd = LockInfoCompositeData.toCompositeData(li);
|
||||
lockInfoCompositeType = cd.getCompositeType();
|
||||
}
|
||||
|
||||
@ -315,9 +321,8 @@ public class ThreadInfoCompositeData extends LazyCompositeData {
|
||||
|
||||
// 6.0 new attributes
|
||||
public LockInfo lockInfo() {
|
||||
LockDataConverter converter = new LockDataConverter();
|
||||
CompositeData lockInfoData = (CompositeData) cdata.get(LOCK_INFO);
|
||||
return converter.toLockInfo(lockInfoData);
|
||||
return LockInfo.from(lockInfoData);
|
||||
}
|
||||
|
||||
public MonitorInfo[] lockedMonitors() {
|
||||
@ -336,13 +341,17 @@ public class ThreadInfoCompositeData extends LazyCompositeData {
|
||||
}
|
||||
|
||||
public LockInfo[] lockedSynchronizers() {
|
||||
LockDataConverter converter = new LockDataConverter();
|
||||
CompositeData[] lockedSyncsData =
|
||||
(CompositeData[]) cdata.get(LOCKED_SYNCS);
|
||||
|
||||
// The LockedSynchronizers item cannot be null, but if it is we will
|
||||
// get a NullPointerException when we ask for its length.
|
||||
return converter.toLockedSynchronizers(lockedSyncsData);
|
||||
LockInfo[] locks = new LockInfo[lockedSyncsData.length];
|
||||
for (int i = 0; i < lockedSyncsData.length; i++) {
|
||||
CompositeData cdi = lockedSyncsData[i];
|
||||
locks[i] = LockInfo.from(cdi);
|
||||
}
|
||||
return locks;
|
||||
}
|
||||
|
||||
/** Validate if the input CompositeData has the expected
|
||||
|
||||
@ -23,7 +23,7 @@
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 5086470 6358247
|
||||
* @bug 5086470 6358247 7193302
|
||||
* @summary Test type conversion when invoking ThreadMXBean.dumpAllThreads
|
||||
* through proxy.
|
||||
*
|
||||
@ -173,6 +173,10 @@ public class ThreadMXBeanProxy {
|
||||
throw new RuntimeException("LockInfo: " + syncs[0] +
|
||||
" IdentityHashCode not matched. Expected: " + hcode);
|
||||
}
|
||||
LockInfo li = info.getLockInfo();
|
||||
if (li == null) {
|
||||
throw new RuntimeException("Expected non-null LockInfo");
|
||||
}
|
||||
}
|
||||
}
|
||||
static class Mutex implements Lock, java.io.Serializable {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user