diff --git a/base/i2-base.h b/base/i2-base.h index 8ba5d3f8a..c0c302a6f 100644 --- a/base/i2-base.h +++ b/base/i2-base.h @@ -35,6 +35,7 @@ #include "mutex.h" #include "condvar.h" +#include "thread.h" #include "object.h" #include "memory.h" #include "delegate.h" diff --git a/base/thread.cpp b/base/thread.cpp new file mode 100644 index 000000000..32ef5069d --- /dev/null +++ b/base/thread.cpp @@ -0,0 +1,69 @@ +#include "i2-base.h" + +using namespace icinga; + +typedef struct threadparam_s +{ + void (*callback)(void*); + void *param; +} threadparam_t; + +#ifdef _WIN32 +static DWORD WINAPI ThreadStartProc(LPVOID param) +{ + threadparam_t *tparam = (threadparam_t *)param; + tparam->callback(tparam->param); + delete tparam; + return 0; +} +#else /* _WIN32 */ +static void *ThreadStartProc(void *param) +{ + threadparam_t *tparam = (threadparam_t *)param; + tparam->callback(tparam->param); + delete tparam; + return NULL; +} +#endif /* _WIN32 */ + + +thread::thread(void (*callback)(void *)) +{ + threadparam_t *tparam = new threadparam_t(); + + if (tparam == NULL) + throw exception(/*"Out of memory"*/); + +#ifdef _WIN32 + m_Thread = CreateThread(NULL, 0, ThreadStartProc, tparam, CREATE_SUSPENDED, NULL); +#else /* _WIN32 */ + pthread_create(&m_Thread, NULL, ThreadStartProc, &tparam); +#endif /* _WIN32 */ +} + +thread::~thread(void) +{ +#ifdef _WIN32 + CloseHandle(m_Thread); +#else /* _WIN32 */ + /* nothing to do here */ +#endif +} + +void thread::terminate(void) +{ +#ifdef _WIN32 + TerminateThread(m_Thread, 0); +#else /* _WIN32 */ + /* nothing to do here */ +#endif +} + +void thread::join(void) +{ +#ifdef _WIN32 + WaitForSingleObject(m_Thread, INFINITE); +#else /* _WIN32 */ + pthread_join(m_Thread, NULL); +#endif +} \ No newline at end of file diff --git a/base/thread.h b/base/thread.h new file mode 100644 index 000000000..39d7c9721 --- /dev/null +++ b/base/thread.h @@ -0,0 +1,29 @@ +#ifndef I2_THREAD_H +#define I2_THREAD_H + +namespace icinga +{ + +using std::function; + +class thread +{ +private: +#ifdef _WIN32 + HANDLE m_Thread; +#else + pthread_t m_Thread; +#endif + +public: + thread(void (*callback)(void *)); + ~thread(void); + + void start(void); + void terminate(void); + void join(void); +}; + +} + +#endif /* I2_THREAD_H */