diff options
author | Dwayne Boone <dwayne@zeroc.com> | 2008-11-19 11:06:31 -0330 |
---|---|---|
committer | Dwayne Boone <dwayne@zeroc.com> | 2008-11-19 11:06:31 -0330 |
commit | 7f24f7fd2361ff5d43775e4523bc78ffdb108306 (patch) | |
tree | 62d26962d53259163ee997a7172af5a8fb550a1d /cpp/src/Slice/SignalHandler.cpp | |
parent | Bug 3541 - Slice signal handling unsafe (diff) | |
download | ice-7f24f7fd2361ff5d43775e4523bc78ffdb108306.tar.bz2 ice-7f24f7fd2361ff5d43775e4523bc78ffdb108306.tar.xz ice-7f24f7fd2361ff5d43775e4523bc78ffdb108306.zip |
Added use of CtrlChandler to slice compilers
Diffstat (limited to 'cpp/src/Slice/SignalHandler.cpp')
-rw-r--r-- | cpp/src/Slice/SignalHandler.cpp | 79 |
1 files changed, 37 insertions, 42 deletions
diff --git a/cpp/src/Slice/SignalHandler.cpp b/cpp/src/Slice/SignalHandler.cpp index fa693d88db7..8fd0261da42 100644 --- a/cpp/src/Slice/SignalHandler.cpp +++ b/cpp/src/Slice/SignalHandler.cpp @@ -7,66 +7,61 @@ // // ********************************************************************** -#include <IceUtil/DisableWarnings.h> #include <Slice/SignalHandler.h> -#include <vector> -#include <cstdlib> +#include <IceUtil/StaticMutex.h> +#include <map> -#ifndef _WIN32 -# include <signal.h> -#endif - - -using namespace std; using namespace Slice; +using namespace IceUtil; +using namespace IceUtilInternal; +using namespace std; -// -// Signal handler routine to unlink output files in case of translator -// being interrupted. -// +static StaticMutex _mutex = ICE_STATIC_MUTEX_INITIALIZER; + +static SignalHandlerCloseCallback _callback = 0; static vector<string> _fileList; -#ifdef _WIN32 -static BOOL WINAPI signalHandler(DWORD dwCtrlType) -#else -static void signalHandler(int signal) -#endif +void +SignalHandler::addFileForCleanup(const string& file) { - for(unsigned int i = 0; i < _fileList.size(); ++i) - { - remove(_fileList[i].c_str()); - } + StaticMutex::Lock lock(_mutex); - exit(1); +cout << "Adding " << file << endl; + _fileList.push_back(file); } - -Slice::SignalHandler::SignalHandler() +void +SignalHandler::setCloseCallback(Slice::SignalHandlerCloseCallback callback) { -#ifdef _WIN32 - SetConsoleCtrlHandler(signalHandler, TRUE); -#else - sigset(SIGHUP, signalHandler); - sigset(SIGINT, signalHandler); - sigset(SIGQUIT, signalHandler); -#endif + _callback = callback; } -Slice::SignalHandler::~SignalHandler() +void +SignalHandler::clearCleanupFileList() { -#ifdef _WIN32 - SetConsoleCtrlHandler(signalHandler, FALSE); -#else - sigset(SIGHUP, SIG_DFL); - sigset(SIGINT, SIG_DFL); - sigset(SIGQUIT, SIG_DFL); -#endif + StaticMutex::Lock lock(_mutex); +cout << "Clearing files" << endl; _fileList.clear(); + _callback = 0; } void -Slice::SignalHandler::addFile(const string& file) +SignalHandler::removeFilesOnInterrupt(int signal) { - _fileList.push_back(file); + StaticMutex::Lock lock(_mutex); + +cout << "Removing files" << endl; + if(_callback != 0) + { + _callback(); + } + + for(unsigned int i = 0; i < _fileList.size(); ++i) + { +cout << " Removing " << _fileList[i] << endl; + remove(_fileList[i].c_str()); + } + + exit(1); } |