blob: 0253a282d1878ee205f1976235f580b04be486eb [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
phoglund@webrtc.org99f7c912012-11-30 10:44:49 +000017#include "webrtc/common_types.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000018
19namespace webrtc {
phoglund@webrtc.org99f7c912012-11-30 10:44:49 +000020class CriticalSectionWrapper {
21 public:
22 // Factory method, constructor disabled
23 static CriticalSectionWrapper* CreateCriticalSection();
niklase@google.com470e71d2011-07-07 08:21:25 +000024
phoglund@webrtc.org99f7c912012-11-30 10:44:49 +000025 virtual ~CriticalSectionWrapper() {}
niklase@google.com470e71d2011-07-07 08:21:25 +000026
phoglund@webrtc.org99f7c912012-11-30 10:44:49 +000027 // Tries to grab lock, beginning of a critical section. Will wait for the
28 // lock to become available if the grab failed.
29 virtual void Enter() = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000030
phoglund@webrtc.org99f7c912012-11-30 10:44:49 +000031 // Returns a grabbed lock, end of critical section.
32 virtual void Leave() = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000033};
34
mflodman@webrtc.orgb19582b2011-12-09 10:02:16 +000035// RAII extension of the critical section. Prevents Enter/Leave mismatches and
niklase@google.com470e71d2011-07-07 08:21:25 +000036// provides more compact critical section syntax.
phoglund@webrtc.org99f7c912012-11-30 10:44:49 +000037class CriticalSectionScoped {
38 public:
39 explicit CriticalSectionScoped(CriticalSectionWrapper* critsec)
40 : ptr_crit_sec_(critsec) {
41 ptr_crit_sec_->Enter();
42 }
mflodman@webrtc.orgb19582b2011-12-09 10:02:16 +000043
phoglund@webrtc.org99f7c912012-11-30 10:44:49 +000044 ~CriticalSectionScoped() {
45 if (ptr_crit_sec_) {
46 Leave();
niklase@google.com470e71d2011-07-07 08:21:25 +000047 }
phoglund@webrtc.org99f7c912012-11-30 10:44:49 +000048 }
niklase@google.com470e71d2011-07-07 08:21:25 +000049
phoglund@webrtc.org99f7c912012-11-30 10:44:49 +000050 private:
51 void Leave() {
52 ptr_crit_sec_->Leave();
53 ptr_crit_sec_ = 0;
54 }
niklase@google.com470e71d2011-07-07 08:21:25 +000055
phoglund@webrtc.org99f7c912012-11-30 10:44:49 +000056 CriticalSectionWrapper* ptr_crit_sec_;
niklase@google.com470e71d2011-07-07 08:21:25 +000057};
phoglund@webrtc.org99f7c912012-11-30 10:44:49 +000058
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +000059} // namespace webrtc
phoglund@webrtc.org99f7c912012-11-30 10:44:49 +000060
61#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_CRITICAL_SECTION_WRAPPER_H_