1*47d53e4dSSergey Makeev #pragma once
2*47d53e4dSSergey Makeev 
3*47d53e4dSSergey Makeev #include <pthread.h>
4*47d53e4dSSergey Makeev 
5*47d53e4dSSergey Makeev 
6*47d53e4dSSergey Makeev namespace MT
7*47d53e4dSSergey Makeev {
8*47d53e4dSSergey Makeev 	class ScopedGuard;
9*47d53e4dSSergey Makeev 
10*47d53e4dSSergey Makeev 	//
11*47d53e4dSSergey Makeev 	//
12*47d53e4dSSergey Makeev 	//
13*47d53e4dSSergey Makeev 	class Mutex
14*47d53e4dSSergey Makeev 	{
15*47d53e4dSSergey Makeev 		pthread_mutexattr_t mutexAttr;
16*47d53e4dSSergey Makeev 		pthread_mutex_t mutex;
17*47d53e4dSSergey Makeev 
18*47d53e4dSSergey Makeev 	private:
19*47d53e4dSSergey Makeev 
20*47d53e4dSSergey Makeev 		Mutex(const Mutex &) {}
21*47d53e4dSSergey Makeev 		void operator=(const Mutex &) {}
22*47d53e4dSSergey Makeev 
23*47d53e4dSSergey Makeev 	public:
24*47d53e4dSSergey Makeev 
25*47d53e4dSSergey Makeev 		Mutex()
26*47d53e4dSSergey Makeev 		{
27*47d53e4dSSergey Makeev 			int res = pthread_mutexattr_init(&mutexAttr);
28*47d53e4dSSergey Makeev 			ASSERT(res == 0, "pthread_mutexattr_init - failed");
29*47d53e4dSSergey Makeev 
30*47d53e4dSSergey Makeev 			res = pthread_mutexattr_settype(&mutexAttr, PTHREAD_MUTEX_RECURSIVE);
31*47d53e4dSSergey Makeev 			ASSERT(res == 0, "pthread_mutexattr_settype - failed");
32*47d53e4dSSergey Makeev 
33*47d53e4dSSergey Makeev 			res = pthread_mutex_init(&mutex, &mutexAttr);
34*47d53e4dSSergey Makeev 			ASSERT(res == 0, "pthread_mutex_init - failed");
35*47d53e4dSSergey Makeev 		}
36*47d53e4dSSergey Makeev 
37*47d53e4dSSergey Makeev 		~Mutex()
38*47d53e4dSSergey Makeev 		{
39*47d53e4dSSergey Makeev 			int res = pthread_mutex_destroy(&mutex);
40*47d53e4dSSergey Makeev 			ASSERT(res == 0, "pthread_mutex_destroy - failed");
41*47d53e4dSSergey Makeev 
42*47d53e4dSSergey Makeev 			res = pthread_mutexattr_destroy(&mutexAttr);
43*47d53e4dSSergey Makeev 			ASSERT(res == 0, "pthread_mutexattr_destroy - failed");
44*47d53e4dSSergey Makeev 		}
45*47d53e4dSSergey Makeev 
46*47d53e4dSSergey Makeev 		friend class MT::ScopedGuard;
47*47d53e4dSSergey Makeev 
48*47d53e4dSSergey Makeev 	private:
49*47d53e4dSSergey Makeev 
50*47d53e4dSSergey Makeev 		void Lock()
51*47d53e4dSSergey Makeev 		{
52*47d53e4dSSergey Makeev 			int res = pthread_mutex_lock(&mutex);
53*47d53e4dSSergey Makeev 			ASSERT(res == 0, "pthread_mutex_lock - failed");
54*47d53e4dSSergey Makeev 		}
55*47d53e4dSSergey Makeev 		void Unlock()
56*47d53e4dSSergey Makeev 		{
57*47d53e4dSSergey Makeev 			int res = pthread_mutex_unlock(&mutex);
58*47d53e4dSSergey Makeev 			ASSERT(res == 0, "pthread_mutex_unlock - failed");
59*47d53e4dSSergey Makeev 		}
60*47d53e4dSSergey Makeev 
61*47d53e4dSSergey Makeev 	};
62*47d53e4dSSergey Makeev 
63*47d53e4dSSergey Makeev 
64*47d53e4dSSergey Makeev }
65*47d53e4dSSergey Makeev 
66*47d53e4dSSergey Makeev 
67