/*
*
* Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
// Copyright (c) 1995-96 by Cisco Systems, Inc.
package com.sun.jmx.snmp.daemon;
import java.util.logging.Level;
import static com.sun.jmx.defaults.JmxProperties.SNMP_ADAPTOR_LOGGER;
/**
* This class retries any timed out inform requests. This class is for internal use.
*/
final class SnmpTimerServer extends Thread {
// VARIABLES
//----------
private SnmpInformRequest req = null ;
SnmpQManager snmpq = null ;
// This boolean is used to stop handling requests while the corresponding SnmpQManager
// is being destroyed.
//
boolean isBeingDestroyed = false;
// CONSTRUCTORS
//-------------
public SnmpTimerServer (ThreadGroup grp, SnmpQManager q) {
super(grp, "SnmpTimerServer") ;
setName("SnmpTimerServer") ;
snmpq = q ;
start() ;
}
public synchronized void stopTimerServer() {
if (isAlive()) {
interrupt();
try {
// Wait until the thread die.
//
join();
} catch (InterruptedException e) {
// Ignore...
}
}
}
public void run() {
Thread.currentThread().setPriority(Thread.NORM_PRIORITY);
if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINER)) {
SNMP_ADAPTOR_LOGGER.logp(Level.FINER, SnmpTimerServer.class.getName(),
"run", "Timer Thread started");
}
while (true) {
try {
if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINER)) {
SNMP_ADAPTOR_LOGGER.logp(Level.FINER, SnmpTimerServer.class.getName(),
"run", "Blocking for inform requests");
}
if (req == null) {
req = snmpq.getTimeoutRequests() ;
}
if (req != null && req.inProgress()) {
if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINER)) {
SNMP_ADAPTOR_LOGGER.logp(Level.FINER, SnmpTimerServer.class.getName(),
"run", "Handle timeout inform request " + req.getRequestId());
}
req.action() ;
req = null ;
}
if (isBeingDestroyed == true)
break;
} catch (Exception e) {
if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, SnmpTimerServer.class.getName(),
"run", "Got unexpected exception", e);
}
} catch (ThreadDeath d) {
if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, SnmpTimerServer.class.getName(),
"run", "ThreadDeath, timer server unexpectedly shutting down", d);
}
throw d ;
} catch (OutOfMemoryError ome) {
if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, SnmpTimerServer.class.getName(),
"run", "OutOfMemoryError", ome);
}
yield();
} catch (Error err) {
if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, SnmpTimerServer.class.getName(),
"run", "Received Internal error", err);
}
}
}
}
}