TIVI-153: Add as dependency for iputils
[profile/ivi/opensp.git] / lib / Mutex.h
1 // Copyright (c) 1996 James Clark
2 // See the file copying.txt for copying permission.
3
4 #ifndef Mutex_INCLUDED
5 #define Mutex_INCLUDED 1
6
7 #ifdef SP_MUTEX_WIN32
8 #define SP_MUTEX
9
10 #define STRICT 1
11 #include <windows.h>
12 // <windows.h> appears to turn these warnings back on
13 #ifdef _MSC_VER
14 #pragma warning ( disable : 4237 )
15 #endif
16
17 #ifdef SP_NAMESPACE
18 namespace SP_NAMESPACE {
19 #endif
20
21 class Mutex {
22 public:
23   class Lock {
24   public:
25     Lock(Mutex *mp) : mp_(mp) {
26       if (mp) ::EnterCriticalSection(&mp->cs_);
27     }
28     ~Lock() {
29       if (mp_) ::LeaveCriticalSection(&mp_->cs_);
30     }
31   private:
32     Mutex *mp_;
33   };
34   Mutex() {
35     ::InitializeCriticalSection(&cs_);
36   }
37   ~Mutex() {
38     ::DeleteCriticalSection(&cs_);
39   }
40   friend class Lock;
41 private:
42   CRITICAL_SECTION cs_;
43 };
44
45 #ifdef SP_NAMESPACE
46 }
47 #endif
48
49 #endif /* SP_MUTEX_WIN32 */
50
51 #ifdef SP_MUTEX_MACH
52 #define SP_MUTEX
53
54 #ifdef SP_NAMESPACE
55 namespace SP_NAMESPACE {
56 #endif
57
58 #ifdef SP_NAMESPACE
59 }
60 #endif
61
62 #endif /* SP_MUTEX_MACH */
63
64 #ifdef SP_MUTEX_PTHREADS
65
66 // Support for pthreads on Linux.
67 // Written by Matthias Clasen <clasen@mathematik.uni-freiburg.de>
68
69 #define SP_MUTEX
70
71 extern "C" {
72 #include <pthread.h>
73 }
74
75 #ifdef SP_NAMESPACE
76 namespace SP_NAMESPACE {
77 #endif
78
79 class Mutex {
80 public:
81   class Lock {
82   // Lock serves to automatically unlock Mutex, however control leaves
83   // a block. Don't let any "warning: unused variable `class Mutex::Lock lock'"
84   // mislead you; hopefully your compiler won't optimise this away...
85   public:
86     Lock(Mutex *mp) : mp_(mp) { if (mp_) pthread_mutex_lock  (&mp_->cs_); }
87     ~Lock()                   { if (mp_) pthread_mutex_unlock(&mp_->cs_); }
88   private:
89     Mutex *mp_;
90   };
91   Mutex()  { pthread_mutex_init (&cs_, NULL); }
92   ~Mutex() { pthread_mutex_destroy (&cs_); }
93   friend class Lock;
94 private:
95   pthread_mutex_t cs_;
96 };
97
98 #ifdef SP_NAMESPACE
99 }
100 #endif
101
102 #endif /* SP_MUTEX_PTHREADS */
103
104 #ifndef SP_MUTEX
105
106 #ifdef SP_NAMESPACE
107 namespace SP_NAMESPACE {
108 #endif
109
110 class Mutex {
111 public:
112   class Lock {
113   public:
114     Lock(Mutex *) { }
115   };
116   Mutex() { }
117 };
118
119 #ifdef SP_NAMESPACE
120 }
121 #endif
122
123 #endif /* not SP_MUTEX */
124
125 #endif /* not Mutex_INCLUDED */