00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef __PION_PROCESS_HEADER__
00011 #define __PION_PROCESS_HEADER__
00012
00013 #include <string>
00014 #include <boost/noncopyable.hpp>
00015 #include <boost/thread/once.hpp>
00016 #include <boost/thread/mutex.hpp>
00017 #include <boost/thread/condition.hpp>
00018 #include <pion/config.hpp>
00019
00020
00021 #ifdef _MSC_VER
00022 #include <windows.h>
00023 #include <tchar.h>
00024 #include <DbgHelp.h>
00025
00026 typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType,
00027 CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
00028 CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
00029 CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam);
00030 #endif
00031
00032 namespace pion {
00033
00037 class PION_API process :
00038 private boost::noncopyable
00039 {
00040 public:
00041
00042
00043 ~process() {}
00044
00046 process(void) {}
00047
00049 static void shutdown(void);
00050
00052 static void wait_for_shutdown(void);
00053
00055 static void initialize(void);
00056
00058 static void daemonize(void);
00059
00060 #ifdef _MSC_VER
00061
00062 class dumpfile_init_exception : public std::exception
00063 {
00064 public:
00065 dumpfile_init_exception(const std::string& cause) : m_cause(cause) {}
00066
00067 virtual const char* what() const { return m_cause.c_str(); }
00068 protected:
00069 std::string m_cause;
00070 };
00071
00077 static void set_dumpfile_directory(const std::string& dir);
00078
00079 protected:
00081 static LONG WINAPI unhandled_exception_filter(struct _EXCEPTION_POINTERS *pExceptionInfo);
00082
00084 static std::string generate_dumpfile_name();
00085 #endif
00086
00087 protected:
00088
00090 struct config_type {
00092 #ifdef _MSC_VER
00093 config_type() : shutdown_now(false), h_dbghelp(NULL), p_dump_proc(NULL) {}
00094 #else
00095 config_type() : shutdown_now(false) {}
00096 #endif
00097
00099 bool shutdown_now;
00100
00102 boost::condition shutdown_cond;
00103
00105 boost::mutex shutdown_mutex;
00106
00107
00108 #ifdef _MSC_VER
00110 std::string dumpfile_dir;
00111
00113 HMODULE h_dbghelp;
00114
00116 MINIDUMPWRITEDUMP p_dump_proc;
00117 #endif
00118 };
00119
00121 static inline config_type& get_config(void) {
00122 boost::call_once(process::create_config, m_instance_flag);
00123 return *m_config_ptr;
00124 }
00125
00126
00127 private:
00128
00130 static void create_config(void);
00131
00132
00134 static boost::once_flag m_instance_flag;
00135
00137 static config_type * m_config_ptr;
00138 };
00139
00140
00141 }
00142
00143 #endif