Initial commit (software version 0.2.0)
[movie-schedule] / src / utils / assertedlock.h
1 // Copyright 2010 Jochen Becher
2 //
3 // This file is part of MovieSchedule.
4 //
5 // MovieSchedule is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // MovieSchedule is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with MovieSchedule.  If not, see <http://www.gnu.org/licenses/>.
17
18 #ifndef ASSERTEDLOCK_H
19 #define ASSERTEDLOCK_H
20
21 #include <QMutex>
22 #include <QReadWriteLock>
23 #include <QMap>
24
25 class QThread;
26
27 class AssertedLock
28 {
29 public:
30     enum LockMode { READ, WRITE };
31
32 #ifndef NDEBUG
33 private:
34     struct LockData {
35         LockData() : _lock_mode(READ), _lock_counter(0) {}
36         LockMode _lock_mode;
37         int _lock_counter;
38     };
39
40     typedef QMap<QThread*, LockData> ThreadData;
41 #endif
42
43 public:
44     AssertedLock();
45     ~AssertedLock();
46
47     void Lock(LockMode mode);
48     void LockForRead() { Lock(READ); }
49     void LockForWrite() { Lock(WRITE); }
50
51     void Unlock();
52
53     void AssertLockedForRead() const
54     {
55 #ifndef DEBUG
56         AssertLockedForMode(READ);
57 #endif
58     }
59
60     void AssertLockedForWrite() const
61     {
62 #ifndef NDEBUG
63         AssertLockedForMode(WRITE);
64 #endif
65     }
66
67     void AssertUnlocked() const
68     {
69 #ifndef NDEBUG
70         AssertNotLocked();
71 #endif
72     }
73
74 #ifndef NDEBUG
75 private:
76     LockMode GetLockMode() const;
77     void SetLockMode(LockMode mode);
78     int GetLockCounter() const;
79     void IncLockCounter();
80     void DecLockCounter();
81     void AssertLockedForMode(LockMode mode) const;
82     void AssertNotLocked() const;
83 #endif
84
85 private:
86 #ifndef NDEBUG
87     int _lock_counter;
88     ThreadData _thread_data;
89     mutable QMutex _mutex;
90 #endif
91     QReadWriteLock _lock;
92 };
93
94 #endif // ASSERTEDLOCK_H