From 5c0eb60b509edf766e649d081d30ab8dea83a8f4 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Sun, 22 Feb 2009 06:16:10 +0000 Subject: added signal controller (console control handler) to windows --- src/signalController.h | 77 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 73 insertions(+), 4 deletions(-) (limited to 'src/signalController.h') diff --git a/src/signalController.h b/src/signalController.h index d99e168..c893e15 100644 --- a/src/signalController.h +++ b/src/signalController.h @@ -32,12 +32,17 @@ #ifndef _SIGNAL_CONTROLLER_H_ #define _SIGNAL_CONTROLLER_H_ -#include +#ifndef NO_SIGNALCONTROLLER + #include #include #include "threadUtils.hpp" +#ifndef _MSC_VER +#include +#endif + class SignalHandler { public: @@ -53,6 +58,7 @@ private: friend class SignalController; }; +#ifndef _MSC_VER class SigIntHandler : public SignalHandler { public: @@ -95,12 +101,53 @@ public: int handle(); }; +#else + +class CtrlCHandler : public SignalHandler +{ +public: + CtrlCHandler() : SignalHandler(CTRL_C_EVENT) {} + int handle(); +}; + +class CtrlBreakHandler : public SignalHandler +{ +public: + CtrlBreakHandler() : SignalHandler(CTRL_BREAK_EVENT) {} + int handle(); +}; + +class CtrlCloseHandler : public SignalHandler +{ +public: + CtrlCloseHandler() : SignalHandler(CTRL_BREAK_EVENT) {} + int handle(); +}; + +class CtrlLogoffHandler : public SignalHandler +{ +public: + CtrlLogoffHandler() : SignalHandler(CTRL_BREAK_EVENT) {} + int handle(); +}; + +class CtrlShutdownHandler : public SignalHandler +{ +public: + CtrlShutdownHandler() : SignalHandler(CTRL_BREAK_EVENT) {} + int handle(); +}; +#endif + class SignalController { public: - SignalController() { thread = NULL; } - ~SignalController(); + static SignalController& instance(); +#ifndef _MSC_VER static void handle(void* s); +#else + static bool handle(DWORD ctrlType); +#endif void init(); int run(); @@ -108,15 +155,37 @@ public: private: typedef std::map HandlerMap; +#ifndef _MSC_VER + SignalController() : thread(null) {}; +#else + SignalController() {}; +#endif + ~SignalController(); SignalController(const SignalController &s); void operator=(const SignalController &s); - + + static SignalController* inst; + static Mutex instMutex; + class instanceCleaner { + public: ~instanceCleaner() { + if(SignalController::inst != NULL) + delete SignalController::inst; + } + }; + friend class instanceCleaner; + std::queue sigQueue; Mutex sigQueueMutex; Semaphore sigQueueSem; +#ifdef _MSC_VER boost::thread* thread; +#endif HandlerMap handler; }; +extern SignalController& gSignalController; + +#endif + #endif -- cgit v1.2.3