#include "ATOOLS/Org/Exception.H" #include "ATOOLS/Org/Terminator_Objects.H" #include "ATOOLS/Org/Run_Parameter.H" #include "ATOOLS/Org/Message.H" #include "ATOOLS/Org/MyStrStream.H" #include "ATOOLS/Org/Shell_Tools.H" #include "ATOOLS/Org/My_MPI.H" #include #include #include using namespace ATOOLS; ATOOLS::Terminator_Object_Handler *ATOOLS::exh(NULL); void ATOOLS::Terminate() { exh->Terminate(1); } Terminator_Object_Handler::Terminator_Object_Handler(): m_noremove(false), m_nbus(0), m_nsegv(0) { std::set_terminate(ATOOLS::Terminate); std::set_unexpected(ATOOLS::Terminate); signal(SIGSEGV,ATOOLS::HandleSignal); signal(SIGINT,ATOOLS::HandleSignal); signal(SIGPIPE,ATOOLS::HandleSignal); signal(SIGBUS,ATOOLS::HandleSignal); signal(SIGFPE,ATOOLS::HandleSignal); signal(SIGABRT,ATOOLS::HandleSignal); signal(SIGTERM,ATOOLS::HandleSignal); signal(SIGXCPU,ATOOLS::HandleSignal); signal(SIGUSR1,ATOOLS::HandleSignal); } bool Terminator_Object_Handler::ReadInStatus(const std::string &path) { bool success(true); msg_Info()<ReadInStatus(path)) success=false; msg_Info()<<"}"<3) Abort(1); msg_Tracking()<<"Terminator_Object_Handler::PrepareTerminate(): " <<"Preparing termination ..."<0) { m_noremove=true; m_terminatorobjects.back()->PrepareTerminate(); m_noremove=false; std::vector::iterator end=m_terminatorobjects.end(); RemoveTerminatorObject(*--end); } while (m_terminatorfunctions.size()>0) { m_noremove=true; m_terminatorfunctions.back()(); m_noremove=false; std::vector::iterator end=m_terminatorfunctions.end(); RemoveTerminatorFunction(*--end); } msg_Tracking()<<"... prepared."<gen.WriteCitationInfo(); msg_Error()<::iterator toit=m_terminatorobjects.begin(); toit!=m_terminatorobjects.end();) { if (*toit==terminatorobject) toit=m_terminatorobjects.erase(toit); else ++toit; } } void Terminator_Object_Handler::RemoveTerminatorFunction(void (*function)(void)) { if (m_noremove) return; for (std::vector::iterator tfit=m_terminatorfunctions.begin(); tfit!=m_terminatorfunctions.end();) { if (*tfit==function) tfit=m_terminatorfunctions.erase(tfit); else ++tfit; } } Terminator_Object_Handler::~Terminator_Object_Handler() { } void ATOOLS::HandleSignal(int signal) { exh->HandleSignal(signal); } void Terminator_Object_Handler::HandleSignal(int signal) { msg_Error()<Error()); rpa->gen.SetVariable ("SHERPA_STATUS_PATH",rpa->gen.Variable("SHERPA_RUN_PATH")+ "/Status__"+rpa->gen.Timer().TimeString(3)); msg_Error()<gen.Variable("SHERPA_STATUS_PATH")<<"'\n"<gen.Variable("SHERPA_STATUS_PATH")); } switch (signal) { case SIGSEGV: ++m_nsegv; GenerateStackTrace(std::cout,false); if (m_nsegv>3) { msg_Error()<3) { msg_Error()<