1 #ifndef MUTEX_HEADER_
2 #define MUTEX_HEADER_
3 
4 #ifdef _MSC_VER
5 #include <windows.h>
6 #else
7 #include <pthread.h>
8 #endif
9 
10 #include <stdlib.h>
11 
12 namespace pcm
13 {
14     class Mutex {
15 #ifdef _MSC_VER
16         HANDLE mutex_;
17 #else
18         pthread_mutex_t mutex_;
19 #endif
20 
21     public:
Mutex()22         Mutex()
23         {
24 #ifdef _MSC_VER
25             mutex_ = CreateMutex(NULL, FALSE, NULL);
26 #else
27             pthread_mutex_init(&mutex_, NULL);
28 #endif
29         }
~Mutex()30         virtual ~Mutex()
31         {
32 #ifdef _MSC_VER
33             CloseHandle(mutex_);
34 #else
35             pthread_mutex_destroy(&mutex_);
36 #endif
37         }
38 
lock()39         void lock()
40         {
41 #ifdef _MSC_VER
42             WaitForSingleObject(mutex_, INFINITE);
43 #else
44             pthread_mutex_lock(&mutex_);
45 #endif
46         }
unlock()47         void unlock()
48         {
49 #ifdef _MSC_VER
50             ReleaseMutex(mutex_);
51 #else
52             pthread_mutex_unlock(&mutex_);
53 #endif
54         }
55 
56         class Scope {
57             Mutex & m;
58         public:
Scope(Mutex & m_)59             Scope(Mutex & m_) : m(m_)
60             {
61                 m.lock();
62             }
~Scope()63             ~Scope() {
64                 m.unlock();
65             }
66         };
67     };
68 }
69 
70 #endif
71