version 0.1.11
[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 void Sleep(const long ms)\r
13 {\r
14         pthread_cond_t c;\r
15         pthread_mutex_t m;\r
16         timespec t;\r
17         timeb tb;\r
18 \r
19         pthread_mutex_init(&m,NULL);\r
20         pthread_cond_init(&c,NULL);\r
21 \r
22         ftime(&tb);\r
23 \r
24         t.tv_sec=tb.time+(ms/1000);\r
25         t.tv_nsec=((1000000L)*(long)tb.millitm)+((1000000L)*(ms%1000));\r
26 \r
27         pthread_mutex_lock(&m);\r
28         pthread_cond_timedwait(&c,&m,&t);\r
29         pthread_mutex_unlock(&m);\r
30 \r
31         pthread_cond_destroy(&c);\r
32         pthread_mutex_destroy(&m);\r
33 }\r
34 \r
35 Thread::Thread()\r
36 {\r
37         m_running=false;\r
38         m_cancelled=false;\r
39         m_runnable=0;\r
40         m_threadnum=0;\r
41         m_threadcleaned=true;\r
42 }\r
43 \r
44 Thread::Thread(Runnable *runnable)\r
45 {\r
46         m_running=false;\r
47         m_cancelled=false;\r
48         m_runnable=runnable;\r
49         m_threadnum=0;\r
50         m_threadcleaned=true;\r
51         if(m_runnable)\r
52         {\r
53                 m_runnable->m_thread=this;\r
54                 Start();\r
55         }\r
56 }\r
57 \r
58 Thread::~Thread()\r
59 {\r
60         Cancel();\r
61         Join();\r
62         if(m_threadcleaned==false)\r
63         {\r
64                 pthread_detach(m_thread);\r
65         }\r
66         if(m_runnable)\r
67         {\r
68                 delete m_runnable;\r
69         }\r
70 }\r
71 \r
72 void Thread::Cancel()\r
73 {\r
74         if(m_running)\r
75         {\r
76                 m_cancelled=true;\r
77         }\r
78 }\r
79 \r
80 void *Thread::EntryPoint(void *pthis)\r
81 {\r
82         if(pthis)\r
83         {\r
84                 ((Thread *)pthis)->m_runnable->Run();\r
85                 ((Thread *)pthis)->m_running=false;\r
86                 ((Thread *)pthis)->m_cancelled=false;\r
87         }\r
88         ((Thread *)pthis)->m_threadnum=0;\r
89         return NULL;\r
90 }\r
91 \r
92 void Thread::Join()\r
93 {\r
94         if(m_running)\r
95         {\r
96                 pthread_join(m_thread,NULL);\r
97                 m_threadcleaned=true;\r
98         }\r
99 }\r
100 \r
101 void Thread::Sleep(const long ms)\r
102 {\r
103         if(m_running)\r
104         {\r
105                 pthread_cond_t c;\r
106                 pthread_mutex_t m;\r
107                 timespec t;\r
108                 timeb tb;\r
109 \r
110                 pthread_mutex_init(&m,NULL);\r
111                 pthread_cond_init(&c,NULL);\r
112 \r
113                 ftime(&tb);\r
114 \r
115                 t.tv_sec=tb.time+(ms/1000);\r
116                 t.tv_nsec=((1000000L)*(long)tb.millitm)+((1000000L)*(ms%1000));\r
117 \r
118                 pthread_mutex_lock(&m);\r
119                 pthread_cond_timedwait(&c,&m,&t);\r
120                 pthread_mutex_unlock(&m);\r
121 \r
122                 pthread_cond_destroy(&c);\r
123                 pthread_mutex_destroy(&m);\r
124         }\r
125 }\r
126 \r
127 void Thread::Start()\r
128 {\r
129         m_running=true;\r
130         m_threadcleaned=false;\r
131         m_threadnum=pthread_create(&m_thread,NULL,Thread::EntryPoint,this);\r
132 }\r
133 \r
134 }       // namespace\r