BALL  1.5.0
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 
31 namespace 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:
125  : ReadLockerType(lock)
126  {}
127  };
128 
139  template <class WriteLockerType, class ReadWriteLockType>
141  : public WriteLockerType
142  {
143  public:
145  : WriteLockerType(lock)
146  {}
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 
BALL::TMutex
Definition: mutex.h:41
BALL_EXPORT
#define BALL_EXPORT
Definition: COMMON/global.h:50
BALL::TMutex::TMutex
TMutex(bool is_recursive=false)
Definition: mutex.h:45
BALL::WriteLocker
TWriteLocker< BALL_DEFAULT_WRITELOCKER_TYPE, BALL_DEFAULT_READWRITELOCK_TYPE > WriteLocker
Definition: mutex.h:228
BALL::TMutex< boost::mutex >::lock
void lock()
Definition: mutex.h:160
BALL::TMutex< QMutex >::TMutex
TMutex(bool is_recursive=false)
Definition: mutex.h:55
ReadLockerType
boost
Definition: graphAlgorithms.h:26
MutexLockerType
BALL::TWriteLocker
Definition: mutex.h:140
BALL::TReadWriteLock
Definition: mutex.h:90
BALL
Definition: constants.h:12
BALL::Mutex
TMutex< BALL_DEFAULT_MUTEX_TYPE > Mutex
Definition: mutex.h:224
BALL::TMutexLocker::TMutexLocker
TMutexLocker(MutexType *mutex)
Definition: mutex.h:76
BALL::TReadWriteLock::TReadWriteLock
TReadWriteLock(bool is_recursive=false)
Definition: mutex.h:94
BALL::MutexLocker
TMutexLocker< BALL_DEFAULT_MUTEXLOCKER_TYPE, BALL_DEFAULT_MUTEX_TYPE > MutexLocker
Definition: mutex.h:226
MutexType
BALL::TReadWriteLock< QReadWriteLock >::TReadWriteLock
TReadWriteLock(bool is_recursive=false)
Definition: mutex.h:104
BALL::TMutex< boost::mutex >::TMutex
TMutex()
Definition: mutex.h:156
BALL::TReadLocker::TReadLocker
TReadLocker(ReadWriteLockType *lock)
Definition: mutex.h:124
global.h
ReadWriteLockType
BALL::ReadWriteLock
TReadWriteLock< BALL_DEFAULT_READWRITELOCK_TYPE > ReadWriteLock
Definition: mutex.h:225
BALL::ReadLocker
TReadLocker< BALL_DEFAULT_READLOCKER_TYPE, BALL_DEFAULT_READWRITELOCK_TYPE > ReadLocker
Definition: mutex.h:227
BALL::TMutex< boost::mutex >::tryLock
bool tryLock()
Definition: mutex.h:165
WriteLockerType
BALL::TReadLocker
Definition: mutex.h:120
BALL::TMutexLocker
Definition: mutex.h:72
BALL::TWriteLocker::TWriteLocker
TWriteLocker(ReadWriteLockType *lock)
Definition: mutex.h:144