#include "hrfiotsmsignalhandler.h"
#include <stdlib.h>
#include <iostream>
#include "TSystem.h"
using namespace std;
ClassImp(HRFIOTsmSignalHandler)
RFILE *HRFIOTsmSignalHandler::fFile;
struct sigaction HRFIOTsmSignalHandler::oldAction[10];
HRFIOTsmSignalHandler::HRFIOTsmSignalHandler(RFILE **file)
{
fFile = *file;
registerSignal();
}
HRFIOTsmSignalHandler::~HRFIOTsmSignalHandler(void)
{
restoreSignal();
}
void HRFIOTsmSignalHandler::handleSignal(Int_t sig)
{
cout << "Caught signal "<< sig << ", cleaning up!" << endl;
cout << "Closing open RFIO file!" << endl;
sigaction(SIGHUP, &oldAction[0], 0);
sigaction(SIGINT, &oldAction[1], 0);
sigaction(SIGQUIT, &oldAction[2], 0);
sigaction(SIGILL, &oldAction[3], 0);
sigaction(SIGABRT, &oldAction[4], 0);
sigaction(SIGBUS, &oldAction[5], 0);
sigaction(SIGKILL, &oldAction[6], 0);
sigaction(SIGSEGV, &oldAction[7], 0);
sigaction(SIGTERM, &oldAction[8], 0);
sigaction(SIGSYS, &oldAction[9], 0);
switch(sig)
{
case SIGHUP:
if(fFile)
{
rfio_fclose(fFile);
fFile = NULL;
if(oldAction[0].sa_handler > SIG_IGN)
oldAction[0].sa_handler(sig);
}
break;
case SIGINT:
if(fFile)
{
rfio_fclose(fFile);
fFile = NULL;
if(oldAction[1].sa_handler > SIG_IGN)
oldAction[1].sa_handler(sig);
}
break;
case SIGQUIT:
if(fFile)
{
rfio_fclose(fFile);
fFile = NULL;
if(oldAction[2].sa_handler > SIG_IGN)
oldAction[2].sa_handler(sig);
}
break;
case SIGILL:
if(fFile)
{
rfio_fclose(fFile);
fFile = NULL;
if(oldAction[3].sa_handler > SIG_IGN)
oldAction[3].sa_handler(sig);
}
break;
case SIGABRT:
if(fFile)
{
rfio_fclose(fFile);
fFile = NULL;
if(oldAction[4].sa_handler > SIG_IGN)
oldAction[4].sa_handler(sig);
}
break;
case SIGBUS:
if(fFile)
{
rfio_fclose(fFile);
fFile = NULL;
if(oldAction[5].sa_handler > SIG_IGN)
oldAction[5].sa_handler(sig);
}
break;
case SIGKILL:
if(fFile)
{
rfio_fclose(fFile);
fFile = NULL;
if(oldAction[6].sa_handler > SIG_IGN)
oldAction[6].sa_handler(sig);
}
break;
case SIGSEGV:
if(fFile)
{
rfio_fclose(fFile);
fFile = NULL;
if(oldAction[7].sa_handler > SIG_IGN)
oldAction[7].sa_handler(sig);
}
break;
case SIGTERM:
if(fFile)
{
rfio_fclose(fFile);
fFile = NULL;
if(oldAction[8].sa_handler > SIG_IGN)
oldAction[8].sa_handler(sig);
}
break;
case SIGSYS:
if(fFile)
{
rfio_fclose(fFile);
fFile = NULL;
if(oldAction[9].sa_handler > SIG_IGN)
oldAction[9].sa_handler(sig);
}
break;
default:
break;
}
exit(1);
}
void HRFIOTsmSignalHandler::registerSignal(void)
{
for(Int_t i=0;i<10;i++)
{
newAction[i].sa_handler = handleSignal;
for(Int_t j=0;j<32;j++)
newAction[i].sa_mask.__val[j] = 0UL;
newAction[i].sa_flags =0;
}
gSystem->ResetSignal(kSigBus,kTRUE);
gSystem->ResetSignal(kSigSegmentationViolation,kTRUE);
gSystem->ResetSignal(kSigSystem,kTRUE);
gSystem->ResetSignal(kSigIllegalInstruction,kTRUE);
gSystem->ResetSignal(kSigPipe,kTRUE);
gSystem->ResetSignal(kSigAlarm,kTRUE);
gSystem->ResetSignal(kSigUrgent,kTRUE);
gSystem->ResetSignal(kSigFloatingException,kTRUE);
gSystem->ResetSignal(kSigInterrupt,kTRUE);
sigaction(SIGHUP, &newAction[0],&oldAction[0]);
sigaction(SIGINT, &newAction[1],&oldAction[1]);
sigaction(SIGQUIT, &newAction[2],&oldAction[2]);
sigaction(SIGILL, &newAction[3],&oldAction[3]);
sigaction(SIGABRT, &newAction[4],&oldAction[4]);
sigaction(SIGBUS, &newAction[5],&oldAction[5]);
sigaction(SIGKILL, &newAction[6],&oldAction[6]);
sigaction(SIGSEGV, &newAction[7],&oldAction[7]);
sigaction(SIGTERM, &newAction[8],&oldAction[8]);
sigaction(SIGSYS, &newAction[9],&oldAction[9]);
}
void HRFIOTsmSignalHandler::restoreSignal(void)
{
sigaction(SIGHUP, &oldAction[0], 0);
sigaction(SIGINT, &oldAction[1], 0);
sigaction(SIGQUIT, &oldAction[2], 0);
sigaction(SIGILL, &oldAction[3], 0);
sigaction(SIGABRT, &oldAction[4], 0);
sigaction(SIGBUS, &oldAction[5], 0);
sigaction(SIGKILL, &oldAction[6], 0);
sigaction(SIGSEGV, &oldAction[7], 0);
sigaction(SIGTERM, &oldAction[8], 0);
sigaction(SIGSYS, &oldAction[9], 0);
}
Last change: Sat May 22 13:07:55 2010
Last generated: 2010-05-22 13:07
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.