OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #ifndef WEBRTC_BASE_CRITICALSECTION_H_ | 11 #ifndef WEBRTC_BASE_CRITICALSECTION_H_ |
12 #define WEBRTC_BASE_CRITICALSECTION_H_ | 12 #define WEBRTC_BASE_CRITICALSECTION_H_ |
13 | 13 |
14 #include "webrtc/base/atomicops.h" | 14 #include "webrtc/base/atomicops.h" |
15 #include "webrtc/base/constructormagic.h" | 15 #include "webrtc/base/constructormagic.h" |
16 #include "webrtc/base/thread_annotations.h" | 16 #include "webrtc/base/thread_annotations.h" |
| 17 #include "webrtc/base/platform_thread_types.h" |
17 | 18 |
18 #if defined(WEBRTC_WIN) | 19 #if defined(WEBRTC_WIN) |
19 // Include winsock2.h before including <windows.h> to maintain consistency with | 20 // Include winsock2.h before including <windows.h> to maintain consistency with |
20 // win32.h. We can't include win32.h directly here since it pulls in | 21 // win32.h. We can't include win32.h directly here since it pulls in |
21 // headers such as basictypes.h which causes problems in Chromium where webrtc | 22 // headers such as basictypes.h which causes problems in Chromium where webrtc |
22 // exists as two separate projects, webrtc and libjingle. | 23 // exists as two separate projects, webrtc and libjingle. |
23 #include <winsock2.h> | 24 #include <winsock2.h> |
24 #include <windows.h> | 25 #include <windows.h> |
25 #include <sal.h> // must come after windows headers. | 26 #include <sal.h> // must come after windows headers. |
26 #endif // defined(WEBRTC_WIN) | 27 #endif // defined(WEBRTC_WIN) |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 // Number of times the lock has been locked + number of threads waiting. | 74 // Number of times the lock has been locked + number of threads waiting. |
74 // TODO(tommi): We could use this number and subtract the recursion count | 75 // TODO(tommi): We could use this number and subtract the recursion count |
75 // to find places where we have multiple threads contending on the same lock. | 76 // to find places where we have multiple threads contending on the same lock. |
76 mutable volatile int lock_queue_; | 77 mutable volatile int lock_queue_; |
77 // |recursion_| represents the recursion count + 1 for the thread that owns | 78 // |recursion_| represents the recursion count + 1 for the thread that owns |
78 // the lock. Only modified by the thread that owns the lock. | 79 // the lock. Only modified by the thread that owns the lock. |
79 mutable int recursion_; | 80 mutable int recursion_; |
80 // Used to signal a single waiting thread when the lock becomes available. | 81 // Used to signal a single waiting thread when the lock becomes available. |
81 mutable dispatch_semaphore_t semaphore_; | 82 mutable dispatch_semaphore_t semaphore_; |
82 // The thread that currently holds the lock. Required to handle recursion. | 83 // The thread that currently holds the lock. Required to handle recursion. |
83 mutable pthread_t owning_thread_; | 84 mutable PlatformThreadRef owning_thread_; |
84 #else | 85 #else |
85 mutable pthread_mutex_t mutex_; | 86 mutable pthread_mutex_t mutex_; |
86 #endif | 87 #endif |
87 CS_DEBUG_CODE(mutable pthread_t thread_); | 88 CS_DEBUG_CODE(mutable PlatformThreadRef thread_); |
88 CS_DEBUG_CODE(mutable int recursion_count_); | 89 CS_DEBUG_CODE(mutable int recursion_count_); |
89 #endif | 90 #endif |
90 }; | 91 }; |
91 | 92 |
92 // CritScope, for serializing execution through a scope. | 93 // CritScope, for serializing execution through a scope. |
93 class SCOPED_LOCKABLE CritScope { | 94 class SCOPED_LOCKABLE CritScope { |
94 public: | 95 public: |
95 explicit CritScope(const CriticalSection* cs) EXCLUSIVE_LOCK_FUNCTION(cs); | 96 explicit CritScope(const CriticalSection* cs) EXCLUSIVE_LOCK_FUNCTION(cs); |
96 ~CritScope() UNLOCK_FUNCTION(); | 97 ~CritScope() UNLOCK_FUNCTION(); |
97 private: | 98 private: |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 explicit GlobalLockScope(GlobalLockPod* lock) EXCLUSIVE_LOCK_FUNCTION(lock); | 145 explicit GlobalLockScope(GlobalLockPod* lock) EXCLUSIVE_LOCK_FUNCTION(lock); |
145 ~GlobalLockScope() UNLOCK_FUNCTION(); | 146 ~GlobalLockScope() UNLOCK_FUNCTION(); |
146 private: | 147 private: |
147 GlobalLockPod* const lock_; | 148 GlobalLockPod* const lock_; |
148 RTC_DISALLOW_COPY_AND_ASSIGN(GlobalLockScope); | 149 RTC_DISALLOW_COPY_AND_ASSIGN(GlobalLockScope); |
149 }; | 150 }; |
150 | 151 |
151 } // namespace rtc | 152 } // namespace rtc |
152 | 153 |
153 #endif // WEBRTC_BASE_CRITICALSECTION_H_ | 154 #endif // WEBRTC_BASE_CRITICALSECTION_H_ |
OLD | NEW |