version 0.1.4
[fms.git] / src / pthreadwrapper / mutex.cpp
1 #include "../../include/pthreadwrapper/mutex.h"\r
2 #include <exception>\r
3 \r
4 #ifndef _WIN32\r
5         #include <sys/errno.h>\r
6 #endif\r
7 \r
8 #ifdef XMEM\r
9         #include <xmem.h>\r
10 #endif\r
11 \r
12 namespace PThread\r
13 {\r
14 \r
15 Mutex::Mutex()\r
16 {\r
17         pthread_mutexattr_init(&m_attr);\r
18         pthread_mutexattr_settype(&m_attr,PTHREAD_MUTEX_ERRORCHECK);\r
19         pthread_mutex_init(&m_mutex,&m_attr);\r
20 }\r
21 \r
22 Mutex::~Mutex()\r
23 {\r
24         pthread_mutex_destroy(&m_mutex);\r
25         pthread_mutexattr_destroy(&m_attr);\r
26 }\r
27 \r
28 void Mutex::Acquire() throw(std::exception)\r
29 {\r
30         int rval=0;\r
31         if((rval=pthread_mutex_lock(&m_mutex))!=0)\r
32         {\r
33                 // deadlock - throw exception\r
34                 if(rval==EDEADLK)\r
35                 {\r
36                         throw DeadlockException();\r
37                 }\r
38         }\r
39 }\r
40 \r
41 void Mutex::Release()\r
42 {\r
43         pthread_mutex_unlock(&m_mutex);\r
44 }\r
45 \r
46 }       // namespace\r