|
Gaudi Framework, version v23r2 |
| Home | Generated: Thu Jun 28 2012 |
Service that stop the processing if a signal is received. More...


Public Member Functions | |
| StopSignalHandler (const std::string &name, ISvcLocator *svcLoc) | |
| StatusCode | initialize () |
| StatusCode | finalize () |
| virtual void | handle (const Incident &) |
| Inform that a new incident has occurred. | |
Private Member Functions | |
| std::pair< int, bool > | i_decodeSignal (const std::string &sig) |
| Function to translate the signal name to the signal number. | |
Private Attributes | |
| std::vector< std::string > | m_usedSignals |
| List of signal names or numbers (encoded as strings) to use to schedule a stop. | |
| std::map< int, bool > | m_signals |
| Map of monitored signal numbers to the flag telling if they have to be propagated or not. | |
| bool | m_stopRequested |
| Flag to remember if the stop has been requested because of a signal. | |
| SmartIF< Gaudi::ISignalMonitor > | m_signalMonitor |
| Pointer to the signal monitor service. | |
| SmartIF< IIncidentSvc > | m_incidentSvc |
| Pointer to the incident service. | |
| SmartIF< IProperty > | m_appProperty |
| Pointer to the interface to set the return code of the application. | |
Service that stop the processing if a signal is received.
The signals to be intercepted have to be declared in the property Signals as a list of strings (signal names or numbers). If '+' is appended to the signal name, then the signal is propagated to the signal handlers already registered when this service is initialized.
Definition at line 345 of file SignalMonitorSvc.cpp.
| Gaudi::Utils::StopSignalHandler::StopSignalHandler | ( | const std::string & | name, |
| ISvcLocator * | svcLoc | ||
| ) | [inline] |
Definition at line 347 of file SignalMonitorSvc.cpp.
: base_class(name, svcLoc) { m_usedSignals.reserve(2); m_usedSignals.push_back("SIGINT"); m_usedSignals.push_back("SIGXCPU"); declareProperty("Signals", m_usedSignals, "List of signal names or numbers to use to schedule a stop. " "If the signal is followed by a '+' the signal is propagated the previously " "registered handler (if any)."); }
| StatusCode Gaudi::Utils::StopSignalHandler::finalize | ( | ) | [inline, virtual] |
Reimplemented from Service.
Definition at line 404 of file SignalMonitorSvc.cpp.
{
m_incidentSvc->removeListener(this, IncidentType::BeginEvent);
m_incidentSvc.reset();
// disable the monitoring of the signals
for (std::map<int, bool>::const_iterator s = m_signals.begin();
s != m_signals.end(); ++s) {
// tell the signal monitor that we are interested in these signals
m_signalMonitor->ignoreSignal(s->first);
}
m_signalMonitor.reset();
return Service::finalize();
}
| virtual void Gaudi::Utils::StopSignalHandler::handle | ( | const Incident & | ) | [inline, virtual] |
Inform that a new incident has occurred.
Implements IIncidentListener.
Definition at line 417 of file SignalMonitorSvc.cpp.
{
if (!m_stopRequested) {
const SigMap& sigmap(SigMap::instance());
for (std::map<int, bool>::const_iterator s = m_signals.begin();
s != m_signals.end(); ++s) {
if (m_signalMonitor->gotSignal(s->first)) {
warning() << "Received signal '" << sigmap.name(s->first)
<< "' (" << s->first;
const std::string &desc = sigmap.desc(s->first);
if ( ! desc.empty() ) {
warning() << ", " << desc;
}
warning() << ")" << endmsg;
m_stopRequested = true;
// Report the termination by signal at the end of the application
using Gaudi::ReturnCode::SignalOffset;
if (Gaudi::setAppReturnCode(m_appProperty, SignalOffset + s->first).isFailure()) {
error() << "Could not set return code of the application ("
<< SignalOffset + s->first << ")"
<< endmsg;
}
}
}
if (m_stopRequested) {
SmartIF<IEventProcessor> ep(serviceLocator());
if (ep) {
warning() << "Scheduling a stop" << endmsg;
ep->stopRun().ignore();
}
else {
warning() << "Cannot stop the processing because the IEventProcessor interface cannot be retrieved." << endmsg;
}
}
}
}
| std::pair<int, bool> Gaudi::Utils::StopSignalHandler::i_decodeSignal | ( | const std::string & | sig ) | [inline, private] |
Function to translate the signal name to the signal number.
Definition at line 466 of file SignalMonitorSvc.cpp.
{
debug() << "Decoding signal declaration '" << sig << "'" << endmsg;
if ( sig.empty() || sig == "+" ) {
debug() << "Empty signal, ignored" << endmsg;
return std::make_pair<int, bool>(-1, false); // silently ignore empty strings
}
const SigMap& sigmap(SigMap::instance());
std::string signal = sig;
bool propagate = false;
// Check if the signal must be propagated
if (signal[signal.size() - 1] == '+') {
debug() << "Must be propagated to previously registered signal handlers" << endmsg;
propagate = true;
signal.erase(signal.size() - 1, 1); // remove the '+' at the end of the string
}
int signum = -1;
// check if the signal is a number
if (std::isdigit(signal[0])){
std::istringstream ss(signal);
ss >> signum;
} else {
// try to find the signal name in the list of known signals
signum = sigmap.signum(signal);
}
if (signum < 0) {
warning() << "Cannot understand signal identifier '" << sig << "', ignored" << endmsg;
} else {
verbose() << "Matched signal '" << sigmap.name(signum)
<< "' (" << signum;
const std::string &desc = sigmap.desc(signum);
if ( ! desc.empty() ) {
verbose() << ", " << desc;
}
verbose() << ")" << endmsg;
}
return std::make_pair(signum, propagate);
}
| StatusCode Gaudi::Utils::StopSignalHandler::initialize | ( | ) | [inline, virtual] |
Reimplemented from Service.
Definition at line 356 of file SignalMonitorSvc.cpp.
{
StatusCode sc = Service::initialize();
if (sc.isFailure()) {
return sc;
}
std::string serviceName("Gaudi::Utils::SignalMonitorSvc");
m_signalMonitor = serviceLocator()->service(serviceName);
if ( ! m_signalMonitor ) {
error() << "Cannot retrieve " << serviceName << endmsg;
return StatusCode::FAILURE;
}
serviceName = "IncidentSvc";
m_incidentSvc = serviceLocator()->service(serviceName);
if ( ! m_incidentSvc ) {
error() << "Cannot retrieve " << serviceName << endmsg;
return StatusCode::FAILURE;
}
// Get the IMainAppStatus interface of the ApplicationMgr
m_appProperty = serviceLocator();
if ( ! m_appProperty ) {
warning() << "Cannot retrieve IProperty interface of ApplicationMgr, "
"the return code will not be changed" << endmsg;
}
// Decode the signal names
std::pair<int, bool> sigid;
for (std::vector<std::string>::const_iterator signame = m_usedSignals.begin();
signame != m_usedSignals.end(); ++signame) {
sigid = i_decodeSignal(*signame);
if (sigid.first >= 0) {
m_signals[sigid.first] = sigid.second;
}
}
debug() << "Stopping on the signals:" << endmsg;
const SigMap& sigmap(SigMap::instance());
for (std::map<int, bool>::const_iterator s = m_signals.begin();
s != m_signals.end(); ++s) {
debug() << "\t" << sigmap.name(s->first) << ": "
<< sigmap.desc(s->first) << " (" << s->first << ")";
if (s->second) debug() << " propagated";
debug() << endmsg;
// tell the signal monitor that we are interested in these signals
m_signalMonitor->monitorSignal(s->first, s->second);
}
m_stopRequested = false;
debug() << "Register to the IncidentSvc" << endmsg;
m_incidentSvc->addListener(this, IncidentType::BeginEvent);
return StatusCode::SUCCESS;
}
Pointer to the interface to set the return code of the application.
Definition at line 464 of file SignalMonitorSvc.cpp.
SmartIF<IIncidentSvc> Gaudi::Utils::StopSignalHandler::m_incidentSvc [private] |
Pointer to the incident service.
Definition at line 462 of file SignalMonitorSvc.cpp.
SmartIF<Gaudi::ISignalMonitor> Gaudi::Utils::StopSignalHandler::m_signalMonitor [private] |
Pointer to the signal monitor service.
Definition at line 460 of file SignalMonitorSvc.cpp.
std::map<int, bool> Gaudi::Utils::StopSignalHandler::m_signals [private] |
Map of monitored signal numbers to the flag telling if they have to be propagated or not.
Definition at line 456 of file SignalMonitorSvc.cpp.
bool Gaudi::Utils::StopSignalHandler::m_stopRequested [private] |
Flag to remember if the stop has been requested because of a signal.
Definition at line 458 of file SignalMonitorSvc.cpp.
std::vector<std::string> Gaudi::Utils::StopSignalHandler::m_usedSignals [private] |
List of signal names or numbers (encoded as strings) to use to schedule a stop.
Definition at line 454 of file SignalMonitorSvc.cpp.