--- /dev/null
+#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