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 class LOCKABLE RWLockWrapper {
23  public:
24   static RWLockWrapper* CreateRWLock();
~RWLockWrapper()25   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:
ReadLockScoped(RWLockWrapper & rw_lock)38   ReadLockScoped(RWLockWrapper& rw_lock) SHARED_LOCK_FUNCTION(rw_lock)
39       : rw_lock_(rw_lock) {
40     rw_lock_.AcquireLockShared();
41   }
42 
UNLOCK_FUNCTION()43   ~ReadLockScoped() UNLOCK_FUNCTION() {
44     rw_lock_.ReleaseLockShared();
45   }
46 
47  private:
48   RWLockWrapper& rw_lock_;
49 };
50 
51 class SCOPED_LOCKABLE WriteLockScoped {
52  public:
WriteLockScoped(RWLockWrapper & rw_lock)53   WriteLockScoped(RWLockWrapper& rw_lock) EXCLUSIVE_LOCK_FUNCTION(rw_lock)
54       : rw_lock_(rw_lock) {
55     rw_lock_.AcquireLockExclusive();
56   }
57 
UNLOCK_FUNCTION()58   ~WriteLockScoped() UNLOCK_FUNCTION() {
59     rw_lock_.ReleaseLockExclusive();
60   }
61 
62  private:
63   RWLockWrapper& rw_lock_;
64 };
65 
66 }  // namespace webrtc
67 
68 #endif  // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_RW_LOCK_WRAPPER_H_
69