Line data Source code
1 : /*
2 : * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 : *
4 : * Use of this source code is governed by a BSD-style license
5 : * that can be found in the LICENSE file in the root of the source
6 : * tree. An additional intellectual property rights grant can be found
7 : * in the file PATENTS. All contributing project authors may
8 : * be found in the AUTHORS file in the root of the source tree.
9 : */
10 :
11 : #ifndef WEBRTC_SYSTEM_WRAPPERS_INCLUDE_RW_LOCK_WRAPPER_H_
12 : #define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_RW_LOCK_WRAPPER_H_
13 :
14 : #include "webrtc/base/thread_annotations.h"
15 :
16 : // Note, Windows pre-Vista version of RW locks are not supported natively. For
17 : // these OSs regular critical sections have been used to approximate RW lock
18 : // functionality and will therefore have worse performance.
19 :
20 : namespace webrtc {
21 :
22 0 : class LOCKABLE RWLockWrapper {
23 : public:
24 : static RWLockWrapper* CreateRWLock();
25 0 : virtual ~RWLockWrapper() {}
26 :
27 : virtual void AcquireLockExclusive() EXCLUSIVE_LOCK_FUNCTION() = 0;
28 : virtual void ReleaseLockExclusive() UNLOCK_FUNCTION() = 0;
29 :
30 : virtual void AcquireLockShared() SHARED_LOCK_FUNCTION() = 0;
31 : virtual void ReleaseLockShared() UNLOCK_FUNCTION() = 0;
32 : };
33 :
34 : // RAII extensions of the RW lock. Prevents Acquire/Release missmatches and
35 : // provides more compact locking syntax.
36 : class SCOPED_LOCKABLE ReadLockScoped {
37 : public:
38 0 : ReadLockScoped(RWLockWrapper& rw_lock) SHARED_LOCK_FUNCTION(rw_lock)
39 0 : : rw_lock_(rw_lock) {
40 0 : rw_lock_.AcquireLockShared();
41 0 : }
42 :
43 0 : ~ReadLockScoped() UNLOCK_FUNCTION() {
44 0 : rw_lock_.ReleaseLockShared();
45 0 : }
46 :
47 : private:
48 : RWLockWrapper& rw_lock_;
49 : };
50 :
51 : class SCOPED_LOCKABLE WriteLockScoped {
52 : public:
53 0 : WriteLockScoped(RWLockWrapper& rw_lock) EXCLUSIVE_LOCK_FUNCTION(rw_lock)
54 0 : : rw_lock_(rw_lock) {
55 0 : rw_lock_.AcquireLockExclusive();
56 0 : }
57 :
58 0 : ~WriteLockScoped() UNLOCK_FUNCTION() {
59 0 : rw_lock_.ReleaseLockExclusive();
60 0 : }
61 :
62 : private:
63 : RWLockWrapper& rw_lock_;
64 : };
65 :
66 : } // namespace webrtc
67 :
68 : #endif // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_RW_LOCK_WRAPPER_H_
|