| /* |
| * 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); |
| } |