version 0.1.3
[fms.git] / src / pthreadwrapper / thread.cpp
1 #include "../../include/pthreadwrapper/thread.h"\r
2 \r
3 #include <sys/timeb.h>\r
4 \r
5 #ifdef XMEM\r
6         #include <xmem.h>\r
7 #endif\r
8 \r
9 namespace PThread\r
10 {\r
11 \r
12 Thread::Thread()\r
13 {\r
14         m_running=false;\r
15         m_cancelled=false;\r
16         m_runnable=0;\r
17 }\r
18 \r
19 Thread::Thread(Runnable *runnable)\r
20 {\r
21         m_running=false;\r
22         m_cancelled=false;\r
23         m_runnable=runnable;\r
24         if(m_runnable)\r
25         {\r
26                 m_runnable->m_thread=this;\r
27                 Start();\r
28         }\r
29 }\r
30 \r
31 Thread::~Thread()\r
32 {\r
33         Cancel();\r
34         Join();\r
35         if(m_runnable)\r
36         {\r
37                 delete m_runnable;\r
38         }\r
39 }\r
40 \r
41 void Thread::Cancel()\r
42 {\r
43         if(m_running)\r
44         {\r
45                 m_cancelled=true;\r
46         }\r
47 }\r
48 \r
49 void *Thread::EntryPoint(void *pthis)\r
50 {\r
51         if(pthis)\r
52         {\r
53                 ((Thread *)pthis)->m_runnable->Run();\r
54                 ((Thread *)pthis)->m_running=false;\r
55                 ((Thread *)pthis)->m_cancelled=false;\r
56         }\r
57         return NULL;\r
58 }\r
59 \r
60 void Thread::Join()\r
61 {\r
62         if(m_running)\r
63         {\r
64                 pthread_join(m_thread,NULL);\r
65         }\r
66 }\r
67 \r
68 void Thread::Sleep(const long ms)\r
69 {\r
70         if(m_running)\r
71         {\r
72                 pthread_cond_t c;\r
73                 pthread_mutex_t m;\r
74                 timespec t;\r
75                 timeb tb;\r
76 \r
77                 pthread_mutex_init(&m,NULL);\r
78                 pthread_cond_init(&c,NULL);\r
79 \r
80                 ftime(&tb);\r
81 \r
82                 t.tv_sec=tb.time+(ms/1000);\r
83                 t.tv_nsec=((1000000L)*(long)tb.millitm)+((1000000L)*(ms%1000));\r
84 \r
85                 pthread_mutex_lock(&m);\r
86                 pthread_cond_timedwait(&c,&m,&t);\r
87                 pthread_mutex_unlock(&m);\r
88         }\r
89 }\r
90 \r
91 void Thread::Start()\r
92 {\r
93         m_running=true;\r
94         pthread_create(&m_thread,NULL,Thread::EntryPoint,this);\r
95 }\r
96 \r
97 }       // namespace\r