version 0.1.3
[fms.git] / src / pthreadwrapper / thread.cpp
diff --git a/src/pthreadwrapper/thread.cpp b/src/pthreadwrapper/thread.cpp
new file mode 100644 (file)
index 0000000..466dd5c
--- /dev/null
@@ -0,0 +1,97 @@
+#include "../../include/pthreadwrapper/thread.h"\r
+\r
+#include <sys/timeb.h>\r
+\r
+#ifdef XMEM\r
+       #include <xmem.h>\r
+#endif\r
+\r
+namespace PThread\r
+{\r
+\r
+Thread::Thread()\r
+{\r
+       m_running=false;\r
+       m_cancelled=false;\r
+       m_runnable=0;\r
+}\r
+\r
+Thread::Thread(Runnable *runnable)\r
+{\r
+       m_running=false;\r
+       m_cancelled=false;\r
+       m_runnable=runnable;\r
+       if(m_runnable)\r
+       {\r
+               m_runnable->m_thread=this;\r
+               Start();\r
+       }\r
+}\r
+\r
+Thread::~Thread()\r
+{\r
+       Cancel();\r
+       Join();\r
+       if(m_runnable)\r
+       {\r
+               delete m_runnable;\r
+       }\r
+}\r
+\r
+void Thread::Cancel()\r
+{\r
+       if(m_running)\r
+       {\r
+               m_cancelled=true;\r
+       }\r
+}\r
+\r
+void *Thread::EntryPoint(void *pthis)\r
+{\r
+       if(pthis)\r
+       {\r
+               ((Thread *)pthis)->m_runnable->Run();\r
+               ((Thread *)pthis)->m_running=false;\r
+               ((Thread *)pthis)->m_cancelled=false;\r
+       }\r
+       return NULL;\r
+}\r
+\r
+void Thread::Join()\r
+{\r
+       if(m_running)\r
+       {\r
+               pthread_join(m_thread,NULL);\r
+       }\r
+}\r
+\r
+void Thread::Sleep(const long ms)\r
+{\r
+       if(m_running)\r
+       {\r
+               pthread_cond_t c;\r
+               pthread_mutex_t m;\r
+               timespec t;\r
+               timeb tb;\r
+\r
+               pthread_mutex_init(&m,NULL);\r
+               pthread_cond_init(&c,NULL);\r
+\r
+               ftime(&tb);\r
+\r
+               t.tv_sec=tb.time+(ms/1000);\r
+               t.tv_nsec=((1000000L)*(long)tb.millitm)+((1000000L)*(ms%1000));\r
+\r
+               pthread_mutex_lock(&m);\r
+               pthread_cond_timedwait(&c,&m,&t);\r
+               pthread_mutex_unlock(&m);\r
+       }\r
+}\r
+\r
+void Thread::Start()\r
+{\r
+       m_running=true;\r
+       pthread_create(&m_thread,NULL,Thread::EntryPoint,this);\r
+}\r
+\r
+}      // namespace\r