Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / webrtc / system_wrappers / interface / rw_lock_wrapper.h
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_INTERFACE_RW_LOCK_WRAPPER_H_
12 #define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_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();
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:
38   ReadLockScoped(RWLockWrapper& rw_lock) SHARED_LOCK_FUNCTION(rw_lock)
39       : rw_lock_(rw_lock) {
40     rw_lock_.AcquireLockShared();
41   }
42
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:
53   WriteLockScoped(RWLockWrapper& rw_lock) EXCLUSIVE_LOCK_FUNCTION(rw_lock)
54       : rw_lock_(rw_lock) {
55     rw_lock_.AcquireLockExclusive();
56   }
57
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_INTERFACE_RW_LOCK_WRAPPER_H_