/* * Project: MoleCuilder * Description: creates and alters molecular systems * Copyright (C) 2012 University of Bonn. All rights reserved. * Please see the LICENSE file or "Copyright notice" in builder.cpp for details. */ /* * SignalHandler.cpp * * Created on: 01.06.2012 * Author: heber */ // include config.h #ifdef HAVE_CONFIG_H #include #endif #include "CodePatterns/MemDebug.hpp" #include #include "CodePatterns/Log.hpp" #include "SignalHandler.hpp" boost::function SignalHandler::signalhandler_fct = 0; void signalhandler(int sig) { SignalHandler::signalhandler_fct(sig); } SignalHandler::SignalHandler(boost::function &_shutdownfunction, std::vector &_signals) : shutdownfunction(_shutdownfunction), signals(_signals), NoSignalsReceived(0), MAX_NOSIGNALSRECEIVED(3) { if (!signalhandler_fct) signalhandler_fct = boost::bind(&SignalHandler::operator(), this, _1); obtainAllHooks(); } SignalHandler::~SignalHandler() { releaseAllHooks(); } void SignalHandler::operator()(int sig) { // increment received signal counter ++NoSignalsReceived; // shutdown if we have handler if (shutdownfunction) shutdownfunction(sig); if (NoSignalsReceived >= MAX_NOSIGNALSRECEIVED) releaseAllHooks(); } void SignalHandler::obtainAllHooks() { for (std::vector::const_iterator iter = signals.begin(); iter != signals.end(); ++iter) { LOG(0, "STATUS: Catching signal " << *iter << " via signal handler."); signal(*iter, signalhandler); } } void SignalHandler::releaseAllHooks() { // release signal hook again for (std::vector::const_iterator iter = signals.begin(); iter != signals.end(); ++iter) signal(*iter, NULL); signals.clear(); }