/*
* Copyright (c) 2003, 2004, 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.snmp.jvminstr;
// java imports
//
import java.io.Serializable;
import java.lang.management.ThreadMXBean;
import java.lang.management.ManagementFactory;
// jmx imports
//
import javax.management.MBeanServer;
import com.sun.jmx.snmp.SnmpString;
import com.sun.jmx.snmp.SnmpStatusException;
// jdmk imports
//
import com.sun.jmx.snmp.agent.SnmpMib;
import com.sun.jmx.snmp.SnmpDefinitions;
import sun.management.snmp.jvmmib.JvmThreadingMBean;
import sun.management.snmp.jvmmib.EnumJvmThreadCpuTimeMonitoring;
import sun.management.snmp.jvmmib.EnumJvmThreadContentionMonitoring;
import sun.management.snmp.util.MibLogger;
/**
* The class is used for implementing the "JvmThreading" group.
*/
public class JvmThreadingImpl implements JvmThreadingMBean {
/**
* Variable for storing the value of "JvmThreadCpuTimeMonitoring".
*
* "The state of the Thread CPU Time Monitoring feature.
* This feature can be:
*
* unsupported: The JVM does not support Thread CPU Time Monitoring.
* enabled : The JVM supports Thread CPU Time Monitoring, and it
* is enabled.
* disabled : The JVM supports Thread CPU Time Monitoring, and it
* is disabled.
*
* Only enabled(3) and disabled(4) may be supplied as values to a
* SET request. unsupported(1) can only be set internally by the
* agent.
*
* See java.lang.management.ThreadMXBean.isThreadCpuTimeSupported(),
* java.lang.management.ThreadMXBean.isThreadCpuTimeEnabled(),
* java.lang.management.ThreadMXBean.setThreadCpuTimeEnabled()
* "
*
*/
final static EnumJvmThreadCpuTimeMonitoring
JvmThreadCpuTimeMonitoringUnsupported =
new EnumJvmThreadCpuTimeMonitoring("unsupported");
final static EnumJvmThreadCpuTimeMonitoring
JvmThreadCpuTimeMonitoringEnabled =
new EnumJvmThreadCpuTimeMonitoring("enabled");
final static EnumJvmThreadCpuTimeMonitoring
JvmThreadCpuTimeMonitoringDisabled =
new EnumJvmThreadCpuTimeMonitoring("disabled");
/**
* Variable for storing the value of "JvmThreadContentionMonitoring".
*
* "The state of the Thread Contention Monitoring feature.
* This feature can be:
*
* unsupported: The JVM does not support Thread Contention Monitoring.
* enabled : The JVM supports Thread Contention Monitoring, and it
* is enabled.
* disabled : The JVM supports Thread Contention Monitoring, and it
* is disabled.
*
* Only enabled(3) and disabled(4) may be supplied as values to a
* SET request. unsupported(1) can only be set internally by the
* agent.
*
* See java.lang.management.ThreadMXBean.isThreadContentionMonitoringSupported(),
* java.lang.management.ThreadMXBean.isThreadContentionMonitoringEnabled(),
* java.lang.management.ThreadMXBean.setThreadContentionMonitoringEnabled()
* "
*
*/
static final EnumJvmThreadContentionMonitoring
JvmThreadContentionMonitoringUnsupported =
new EnumJvmThreadContentionMonitoring("unsupported");
static final EnumJvmThreadContentionMonitoring
JvmThreadContentionMonitoringEnabled =
new EnumJvmThreadContentionMonitoring("enabled");
static final EnumJvmThreadContentionMonitoring
JvmThreadContentionMonitoringDisabled =
new EnumJvmThreadContentionMonitoring("disabled");
/**
* Constructor for the "JvmThreading" group.
* If the group contains a table, the entries created through an SNMP SET
* will not be registered in Java DMK.
*/
public JvmThreadingImpl(SnmpMib myMib) {
log.debug("JvmThreadingImpl","Constructor");
}
/**
* Constructor for the "JvmThreading" group.
* If the group contains a table, the entries created through an SNMP SET
* will be AUTOMATICALLY REGISTERED in Java DMK.
*/
public JvmThreadingImpl(SnmpMib myMib, MBeanServer server) {
log.debug("JvmThreadingImpl","Constructor with server");
}
/**
* ThreadMXBean accessor. It is acquired from the
* java.lang.management.ManagementFactory
* @return The local ThreadMXBean.
*/
static ThreadMXBean getThreadMXBean() {
return ManagementFactory.getThreadMXBean();
}
/**
* Getter for the "JvmThreadCpuTimeMonitoring" variable.
*/
public EnumJvmThreadCpuTimeMonitoring getJvmThreadCpuTimeMonitoring()
throws SnmpStatusException {
ThreadMXBean mbean = getThreadMXBean();
if(!mbean.isThreadCpuTimeSupported()) {
log.debug("getJvmThreadCpuTimeMonitoring",
"Unsupported ThreadCpuTimeMonitoring");
return JvmThreadCpuTimeMonitoringUnsupported;
}
try {
if(mbean.isThreadCpuTimeEnabled()) {
log.debug("getJvmThreadCpuTimeMonitoring",
"Enabled ThreadCpuTimeMonitoring");
return JvmThreadCpuTimeMonitoringEnabled;
} else {
log.debug("getJvmThreadCpuTimeMonitoring",
"Disabled ThreadCpuTimeMonitoring");
return JvmThreadCpuTimeMonitoringDisabled;
}
}catch(UnsupportedOperationException e) {
log.debug("getJvmThreadCpuTimeMonitoring",
"Newly unsupported ThreadCpuTimeMonitoring");
return JvmThreadCpuTimeMonitoringUnsupported;
}
}
/**
* Setter for the "JvmThreadCpuTimeMonitoring" variable.
*/
public void setJvmThreadCpuTimeMonitoring(EnumJvmThreadCpuTimeMonitoring x)
throws SnmpStatusException {
ThreadMXBean mbean = getThreadMXBean();
// We can trust the received value, it has been checked in
// checkJvmThreadCpuTimeMonitoring
if(JvmThreadCpuTimeMonitoringEnabled.intValue() == x.intValue())
mbean.setThreadCpuTimeEnabled(true);
else
mbean.setThreadCpuTimeEnabled(false);
}
/**
* Checker for the "JvmThreadCpuTimeMonitoring" variable.
*/
public void checkJvmThreadCpuTimeMonitoring(EnumJvmThreadCpuTimeMonitoring
x)
throws SnmpStatusException {
//Can't be set externaly to unsupported state.
if(JvmThreadCpuTimeMonitoringUnsupported.intValue() == x.intValue()) {
log.debug("checkJvmThreadCpuTimeMonitoring",
"Try to set to illegal unsupported value");
throw new SnmpStatusException(SnmpDefinitions.snmpRspWrongValue);
}
if ((JvmThreadCpuTimeMonitoringEnabled.intValue() == x.intValue()) ||
(JvmThreadCpuTimeMonitoringDisabled.intValue() == x.intValue())) {
// The value is a valid value. But is the feature supported?
ThreadMXBean mbean = getThreadMXBean();
if(mbean.isThreadCpuTimeSupported()) return;
// Not supported.
log.debug("checkJvmThreadCpuTimeMonitoring",
"Unsupported operation, can't set state");
throw new
SnmpStatusException(SnmpDefinitions.snmpRspInconsistentValue);
}
// Unknown value.
log.debug("checkJvmThreadCpuTimeMonitoring",
"unknown enum value ");
throw new SnmpStatusException(SnmpDefinitions.snmpRspWrongValue);
}
/**
* Getter for the "JvmThreadContentionMonitoring" variable.
*/
public EnumJvmThreadContentionMonitoring getJvmThreadContentionMonitoring()
throws SnmpStatusException {
ThreadMXBean mbean = getThreadMXBean();
if(!mbean.isThreadContentionMonitoringSupported()) {
log.debug("getJvmThreadContentionMonitoring",
"Unsupported ThreadContentionMonitoring");
return JvmThreadContentionMonitoringUnsupported;
}
if(mbean.isThreadContentionMonitoringEnabled()) {
log.debug("getJvmThreadContentionMonitoring",
"Enabled ThreadContentionMonitoring");
return JvmThreadContentionMonitoringEnabled;
} else {
log.debug("getJvmThreadContentionMonitoring",
"Disabled ThreadContentionMonitoring");
return JvmThreadContentionMonitoringDisabled;
}
}
/**
* Setter for the "JvmThreadContentionMonitoring" variable.
*/
public void setJvmThreadContentionMonitoring(
EnumJvmThreadContentionMonitoring x)
throws SnmpStatusException {
ThreadMXBean mbean = getThreadMXBean();
// We can trust the received value, it has been checked in
// checkJvmThreadContentionMonitoring
if(JvmThreadContentionMonitoringEnabled.intValue() == x.intValue())
mbean.setThreadContentionMonitoringEnabled(true);
else
mbean.setThreadContentionMonitoringEnabled(false);
}
/**
* Checker for the "JvmThreadContentionMonitoring" variable.
*/
public void checkJvmThreadContentionMonitoring(
EnumJvmThreadContentionMonitoring x)
throws SnmpStatusException {
//Can't be set externaly to unsupported state.
if(JvmThreadContentionMonitoringUnsupported.intValue()==x.intValue()) {
log.debug("checkJvmThreadContentionMonitoring",
"Try to set to illegal unsupported value");
throw new SnmpStatusException(SnmpDefinitions.snmpRspWrongValue);
}
if ((JvmThreadContentionMonitoringEnabled.intValue()==x.intValue()) ||
(JvmThreadContentionMonitoringDisabled.intValue()==x.intValue())) {
// The value is valid, but is the feature supported ?
ThreadMXBean mbean = getThreadMXBean();
if(mbean.isThreadContentionMonitoringSupported()) return;
log.debug("checkJvmThreadContentionMonitoring",
"Unsupported operation, can't set state");
throw new
SnmpStatusException(SnmpDefinitions.snmpRspInconsistentValue);
}
log.debug("checkJvmThreadContentionMonitoring",
"Try to set to unknown value");
throw new SnmpStatusException(SnmpDefinitions.snmpRspWrongValue);
}
/**
* Getter for the "JvmThreadTotalStartedCount" variable.
*/
public Long getJvmThreadTotalStartedCount() throws SnmpStatusException {
return new Long(getThreadMXBean().getTotalStartedThreadCount());
}
/**
* Getter for the "JvmThreadPeakCount" variable.
*/
public Long getJvmThreadPeakCount() throws SnmpStatusException {
return new Long(getThreadMXBean().getPeakThreadCount());
}
/**
* Getter for the "JvmThreadDaemonCount" variable.
*/
public Long getJvmThreadDaemonCount() throws SnmpStatusException {
return new Long(getThreadMXBean().getDaemonThreadCount());
}
/**
* Getter for the "JvmThreadCount" variable.
*/
public Long getJvmThreadCount() throws SnmpStatusException {
return new Long(getThreadMXBean().getThreadCount());
}
/**
* Getter for the "JvmThreadPeakCountReset" variable.
*/
public synchronized Long getJvmThreadPeakCountReset()
throws SnmpStatusException {
return new Long(jvmThreadPeakCountReset);
}
/**
* Setter for the "JvmThreadPeakCountReset" variable.
*/
public synchronized void setJvmThreadPeakCountReset(Long x)
throws SnmpStatusException {
final long l = x.longValue();
if (l > jvmThreadPeakCountReset) {
final long stamp = System.currentTimeMillis();
getThreadMXBean().resetPeakThreadCount();
jvmThreadPeakCountReset = stamp;
log.debug("setJvmThreadPeakCountReset",
"jvmThreadPeakCountReset="+stamp);
}
}
/**
* Checker for the "JvmThreadPeakCountReset" variable.
*/
public void checkJvmThreadPeakCountReset(Long x)
throws SnmpStatusException {
}
/* Last time thread peak count was reset */
private long jvmThreadPeakCountReset=0;
static final MibLogger log = new MibLogger(JvmThreadingImpl.class);
}