BALL 1.5.0
Loading...
Searching...
No Matches
mutex.h
Go to the documentation of this file.
1// -*- Mode: C++; tab-width: 2; -*-
2// vi: set ts=2:
3//
4
5#ifndef BALL_SYSTEM_MUTEX_H
6#define BALL_SYSTEM_MUTEX_H
7
8#ifndef BALL_COMMON_GLOBAL_H
9# include <BALL/COMMON/global.h>
10#endif
11
12#include <QtCore/QMutex>
13#include <QtCore/QReadWriteLock>
14#include <QtCore/QMutexLocker>
15#include <QtCore/QReadLocker>
16#include <QtCore/QWriteLocker>
17
18#include <boost/thread/mutex.hpp>
19
20#undef BALL_USE_THREAD_CHECKER_API
21#ifdef BALL_USE_THREAD_CHECKER_API
22# include <libittnotify.h>
23#endif
24
25#define BALL_DEFAULT_MUTEX_TYPE QMutex
26#define BALL_DEFAULT_MUTEXLOCKER_TYPE QMutexLocker
27#define BALL_DEFAULT_READWRITELOCK_TYPE QReadWriteLock
28#define BALL_DEFAULT_READLOCKER_TYPE QReadLocker
29#define BALL_DEFAULT_WRITELOCKER_TYPE QWriteLocker
30
31namespace BALL
32{
40 template <class MutexType>
41 class TMutex
42 : public MutexType
43 {
44 public:
45 TMutex(bool is_recursive = false)
46 : MutexType()
47 {}
48 };
49
50 template <>
51 class TMutex<QMutex>
52 : public QMutex
53 {
54 public:
55 TMutex(bool is_recursive = false)
56 : QMutex( is_recursive ? Recursive : NonRecursive )
57 {
58 }
59 };
60
71 template <class MutexLockerType, class MutexType>
73 : public MutexLockerType
74 {
75 public:
77 : MutexLockerType(mutex)
78 {}
79 };
80
89 template <class ReadWriteLockType>
91 : public ReadWriteLockType
92 {
93 public:
94 TReadWriteLock(bool is_recursive = false)
96 {}
97 };
98
99 template <>
100 class TReadWriteLock<QReadWriteLock>
101 : public QReadWriteLock
102 {
103 public:
104 TReadWriteLock(bool is_recursive = false)
105 : QReadWriteLock( is_recursive ? Recursive : NonRecursive )
106 {}
107 };
108
119 template <class ReadLockerType, class ReadWriteLockType>
121 : public ReadLockerType
122 {
123 public:
127 };
128
139 template <class WriteLockerType, class ReadWriteLockType>
141 : public WriteLockerType
142 {
143 public:
147 };
148
149
150 // Boost-based mutexes only require a mapping of tryLock to try_lock.
151 template <>
152 class TMutex<boost::mutex>
153 : public boost::mutex
154 {
155 public:
157 : boost::mutex()
158 {}
159
160 void lock()
161 {
162 return boost::mutex::lock();
163 }
164
165 bool tryLock()
166 {
167 return try_lock();
168 }
169 };
170
171
172#ifdef BALL_USE_THREAD_CHECKER_API
173 template <>
174 class TMutex<QMutex>
175 : public QMutex
176 {
177 public:
178 TMutex()
179 : QMutex()
180 {
181 }
182
183 void lock()
184 {
185 __itt_notify_sync_prepare((void *)this);
186 QMutex::lock();
187 __itt_notify_sync_acquired((void*)this);
188 }
189
190 void unlock()
191 {
192 __itt_notify_sync_releasing((void *)this);
193 QMutex::unlock();
194 }
195
196 bool tryLock()
197 {
198 __itt_notify_sync_prepare((void*)this);
199 bool result = QMutex::tryLock();
200
201 if (result)
202 __itt_notify_sync_acquired((void*)this);
203 else
204 __itt_notify_sync_cancel((void*)this);
205
206 return result;
207 }
208 };
209
210 // TODO: similar instantiation for TReadWriteLock
211
212#else
213// required for visual studio
214#ifdef BALL_COMPILER_MSVC
215 //template class BALL_EXPORT TMutex<BALL_DEFAULT_MUTEX_TYPE>;
216 //template class BALL_EXPORT TReadWriteLock<BALL_DEFAULT_READWRITELOCK_TYPE>;
217 template class BALL_EXPORT TMutexLocker<BALL_DEFAULT_MUTEXLOCKER_TYPE, BALL_DEFAULT_MUTEX_TYPE>;
218 template class BALL_EXPORT TReadLocker<BALL_DEFAULT_READLOCKER_TYPE, BALL_DEFAULT_READWRITELOCK_TYPE>;
219 template class BALL_EXPORT TWriteLocker<BALL_DEFAULT_WRITELOCKER_TYPE, BALL_DEFAULT_READWRITELOCK_TYPE>;
220#endif
221#endif
222
223 // the standard mutex to use
229}
230
231#endif // BALL_SYSTEM_MUTEX_H
232
TMutexLocker< BALL_DEFAULT_MUTEXLOCKER_TYPE, BALL_DEFAULT_MUTEX_TYPE > MutexLocker
Definition mutex.h:226
TWriteLocker< BALL_DEFAULT_WRITELOCKER_TYPE, BALL_DEFAULT_READWRITELOCK_TYPE > WriteLocker
Definition mutex.h:228
TMutex< BALL_DEFAULT_MUTEX_TYPE > Mutex
Definition mutex.h:224
TReadLocker< BALL_DEFAULT_READLOCKER_TYPE, BALL_DEFAULT_READWRITELOCK_TYPE > ReadLocker
Definition mutex.h:227
TReadWriteLock< BALL_DEFAULT_READWRITELOCK_TYPE > ReadWriteLock
Definition mutex.h:225
TMutex(bool is_recursive=false)
Definition mutex.h:45
TMutex(bool is_recursive=false)
Definition mutex.h:55
TMutexLocker(MutexType *mutex)
Definition mutex.h:76
TReadWriteLock(bool is_recursive=false)
Definition mutex.h:94
TReadWriteLock(bool is_recursive=false)
Definition mutex.h:104
TReadLocker(ReadWriteLockType *lock)
Definition mutex.h:124
TWriteLocker(ReadWriteLockType *lock)
Definition mutex.h:144
#define BALL_EXPORT