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