blob: a3a1134c837e49f5dcf9d16aabab25a4d4fbc551 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
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_CRITICAL_SECTION_WRAPPER_H_
12#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_CRITICAL_SECTION_WRAPPER_H_
13
14// If the critical section is heavily contended it may be beneficial to use
15// read/write locks instead.
16
17#include "common_types.h"
18
19namespace webrtc {
20class CriticalSectionWrapper
21{
22public:
23 // Factory method, constructor disabled
24 static CriticalSectionWrapper* CreateCriticalSection();
25
26 virtual ~CriticalSectionWrapper() {}
27
28 // Tries to grab lock, beginning of a critical section. Will wait for the
29 // lock to become available if the grab failed.
30 virtual void Enter() = 0;
31
32 // Returns a grabbed lock, end of critical section.
33 virtual void Leave() = 0;
34};
35
mflodman@webrtc.orgb19582b2011-12-09 10:02:16 +000036// RAII extension of the critical section. Prevents Enter/Leave mismatches and
niklase@google.com470e71d2011-07-07 08:21:25 +000037// provides more compact critical section syntax.
38class CriticalSectionScoped
39{
40public:
mflodman@webrtc.orgb19582b2011-12-09 10:02:16 +000041 explicit CriticalSectionScoped(CriticalSectionWrapper* critsec)
42 : _ptrCritSec(critsec)
43 {
44 _ptrCritSec->Enter();
45 }
46
niklase@google.com470e71d2011-07-07 08:21:25 +000047 ~CriticalSectionScoped()
48 {
49 if (_ptrCritSec)
50 {
51 Leave();
52 }
53 }
54
55private:
56 void Leave()
57 {
58 _ptrCritSec->Leave();
59 _ptrCritSec = 0;
60 }
61
62 CriticalSectionWrapper* _ptrCritSec;
63};
64} // namespace webrtc
65#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_CRITICAL_SECTION_WRAPPER_H_