7a4e972906769a880af6886506bca0e9d1064ee4
[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         m_threadnum=0;\r
18 }\r
19 \r
20 Thread::Thread(Runnable *runnable)\r
21 {\r
22         m_running=false;\r
23         m_cancelled=false;\r
24         m_runnable=runnable;\r
25         m_threadnum=0;\r
26         if(m_runnable)\r
27         {\r
28                 m_runnable->m_thread=this;\r
29                 Start();\r
30         }\r
31 }\r
32 \r
33 Thread::~Thread()\r
34 {\r
35         Cancel();\r
36         Join();\r
37         if(m_runnable)\r
38         {\r
39                 delete m_runnable;\r
40         }\r
41 }\r
42 \r
43 void Thread::Cancel()\r
44 {\r
45         if(m_running)\r
46         {\r
47                 m_cancelled=true;\r
48         }\r
49 }\r
50 \r
51 void *Thread::EntryPoint(void *pthis)\r
52 {\r
53         if(pthis)\r
54         {\r
55                 ((Thread *)pthis)->m_runnable->Run();\r
56                 ((Thread *)pthis)->m_running=false;\r
57                 ((Thread *)pthis)->m_cancelled=false;\r
58         }\r
59         ((Thread *)pthis)->m_threadnum=0;\r
60         return NULL;\r
61 }\r
62 \r
63 void Thread::Join()\r
64 {\r
65         if(m_running)\r
66         {\r
67                 pthread_join(m_thread,NULL);\r
68         }\r
69 }\r
70 \r
71 void Thread::Sleep(const long ms)\r
72 {\r
73         if(m_running)\r
74         {\r
75                 pthread_cond_t c;\r
76                 pthread_mutex_t m;\r
77                 timespec t;\r
78                 timeb tb;\r
79 \r
80                 pthread_mutex_init(&m,NULL);\r
81                 pthread_cond_init(&c,NULL);\r
82 \r
83                 ftime(&tb);\r
84 \r
85                 t.tv_sec=tb.time+(ms/1000);\r
86                 t.tv_nsec=((1000000L)*(long)tb.millitm)+((1000000L)*(ms%1000));\r
87 \r
88                 pthread_mutex_lock(&m);\r
89                 pthread_cond_timedwait(&c,&m,&t);\r
90                 pthread_mutex_unlock(&m);\r
91         }\r
92 }\r
93 \r
94 void Thread::Start()\r
95 {\r
96         m_running=true;\r
97         m_threadnum=pthread_create(&m_thread,NULL,Thread::EntryPoint,this);\r
98 }\r
99 \r
100 }       // namespace\r