00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef __PION_SHUTDOWNMANAGER_HEADER__
00011 #define __PION_SHUTDOWNMANAGER_HEADER__
00012
00013 #include <boost/thread/mutex.hpp>
00014 #include <boost/thread/condition.hpp>
00015 #ifndef PION_WIN32
00016 #include <signal.h>
00017 #endif
00018
00019
00023 class ShutdownManager {
00024 public:
00025
00026 ShutdownManager(void) : m_shutdown_now(false) {}
00027 ~ShutdownManager() {}
00028
00030 inline void shutdown(void) {
00031 boost::mutex::scoped_lock shutdown_lock(m_shutdown_mutex);
00032 m_shutdown_now = true;
00033 m_shutdown_cond.notify_all();
00034 }
00035
00037 inline void wait(void) {
00038 boost::mutex::scoped_lock shutdown_lock(m_shutdown_mutex);
00039 while (! m_shutdown_now)
00040 m_shutdown_cond.wait(shutdown_lock);
00041 }
00042
00043 private:
00045 bool m_shutdown_now;
00046
00048 boost::mutex m_shutdown_mutex;
00049
00051 boost::condition m_shutdown_cond;
00052 };
00053
00055 static ShutdownManager main_shutdown_manager;
00056
00057
00059 #ifdef PION_WIN32
00060 BOOL WINAPI console_ctrl_handler(DWORD ctrl_type)
00061 {
00062 switch(ctrl_type) {
00063 case CTRL_C_EVENT:
00064 case CTRL_BREAK_EVENT:
00065 case CTRL_CLOSE_EVENT:
00066 case CTRL_SHUTDOWN_EVENT:
00067 main_shutdown_manager.shutdown();
00068 return TRUE;
00069 default:
00070 return FALSE;
00071 }
00072 }
00073 #else
00074 void handle_signal(int sig)
00075 {
00076 main_shutdown_manager.shutdown();
00077 }
00078 #endif
00079
00080
00081 #endif