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