OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2015 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 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 # if defined(WEBRTC_MAC) && !USE_NATIVE_MUTEX_ON_MAC | 49 # if defined(WEBRTC_MAC) && !USE_NATIVE_MUTEX_ON_MAC |
50 dispatch_release(semaphore_); | 50 dispatch_release(semaphore_); |
51 # else | 51 # else |
52 pthread_mutex_destroy(&mutex_); | 52 pthread_mutex_destroy(&mutex_); |
53 # endif | 53 # endif |
54 #else | 54 #else |
55 # error Unsupported platform. | 55 # error Unsupported platform. |
56 #endif | 56 #endif |
57 } | 57 } |
58 | 58 |
59 void CriticalSection::Enter() const { | 59 void CriticalSection::Enter() const EXCLUSIVE_LOCK_FUNCTION() { |
60 #if defined(WEBRTC_WIN) | 60 #if defined(WEBRTC_WIN) |
61 EnterCriticalSection(&crit_); | 61 EnterCriticalSection(&crit_); |
62 #elif defined(WEBRTC_POSIX) | 62 #elif defined(WEBRTC_POSIX) |
63 # if defined(WEBRTC_MAC) && !USE_NATIVE_MUTEX_ON_MAC | 63 # if defined(WEBRTC_MAC) && !USE_NATIVE_MUTEX_ON_MAC |
64 int spin = 3000; | 64 int spin = 3000; |
65 PlatformThreadRef self = CurrentThreadRef(); | 65 PlatformThreadRef self = CurrentThreadRef(); |
66 bool have_lock = false; | 66 bool have_lock = false; |
67 do { | 67 do { |
68 // Instead of calling TryEnter() in this loop, we do two interlocked | 68 // Instead of calling TryEnter() in this loop, we do two interlocked |
69 // operations, first a read-only one in order to avoid affecting the lock | 69 // operations, first a read-only one in order to avoid affecting the lock |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 } else { | 108 } else { |
109 RTC_DCHECK(CurrentThreadIsOwner()); | 109 RTC_DCHECK(CurrentThreadIsOwner()); |
110 } | 110 } |
111 ++recursion_count_; | 111 ++recursion_count_; |
112 # endif | 112 # endif |
113 #else | 113 #else |
114 # error Unsupported platform. | 114 # error Unsupported platform. |
115 #endif | 115 #endif |
116 } | 116 } |
117 | 117 |
118 bool CriticalSection::TryEnter() const { | 118 bool CriticalSection::TryEnter() const EXCLUSIVE_TRYLOCK_FUNCTION(true) { |
119 #if defined(WEBRTC_WIN) | 119 #if defined(WEBRTC_WIN) |
120 return TryEnterCriticalSection(&crit_) != FALSE; | 120 return TryEnterCriticalSection(&crit_) != FALSE; |
121 #elif defined(WEBRTC_POSIX) | 121 #elif defined(WEBRTC_POSIX) |
122 # if defined(WEBRTC_MAC) && !USE_NATIVE_MUTEX_ON_MAC | 122 # if defined(WEBRTC_MAC) && !USE_NATIVE_MUTEX_ON_MAC |
123 if (!IsThreadRefEqual(owning_thread_, CurrentThreadRef())) { | 123 if (!IsThreadRefEqual(owning_thread_, CurrentThreadRef())) { |
124 if (AtomicOps::CompareAndSwap(&lock_queue_, 0, 1) != 0) | 124 if (AtomicOps::CompareAndSwap(&lock_queue_, 0, 1) != 0) |
125 return false; | 125 return false; |
126 owning_thread_ = CurrentThreadRef(); | 126 owning_thread_ = CurrentThreadRef(); |
127 RTC_DCHECK(!recursion_); | 127 RTC_DCHECK(!recursion_); |
128 } else { | 128 } else { |
(...skipping 12 matching lines...) Expand all Loading... |
141 RTC_DCHECK(CurrentThreadIsOwner()); | 141 RTC_DCHECK(CurrentThreadIsOwner()); |
142 } | 142 } |
143 ++recursion_count_; | 143 ++recursion_count_; |
144 # endif | 144 # endif |
145 return true; | 145 return true; |
146 #else | 146 #else |
147 # error Unsupported platform. | 147 # error Unsupported platform. |
148 #endif | 148 #endif |
149 } | 149 } |
150 | 150 |
151 void CriticalSection::Leave() const { | 151 void CriticalSection::Leave() const UNLOCK_FUNCTION() { |
152 RTC_DCHECK(CurrentThreadIsOwner()); | 152 RTC_DCHECK(CurrentThreadIsOwner()); |
153 #if defined(WEBRTC_WIN) | 153 #if defined(WEBRTC_WIN) |
154 LeaveCriticalSection(&crit_); | 154 LeaveCriticalSection(&crit_); |
155 #elif defined(WEBRTC_POSIX) | 155 #elif defined(WEBRTC_POSIX) |
156 # if CS_DEBUG_CHECKS | 156 # if CS_DEBUG_CHECKS |
157 --recursion_count_; | 157 --recursion_count_; |
158 RTC_DCHECK(recursion_count_ >= 0); | 158 RTC_DCHECK(recursion_count_ >= 0); |
159 if (!recursion_count_) | 159 if (!recursion_count_) |
160 thread_ = 0; | 160 thread_ = 0; |
161 # endif | 161 # endif |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 GlobalLockScope::GlobalLockScope(GlobalLockPod* lock) | 243 GlobalLockScope::GlobalLockScope(GlobalLockPod* lock) |
244 : lock_(lock) { | 244 : lock_(lock) { |
245 lock_->Lock(); | 245 lock_->Lock(); |
246 } | 246 } |
247 | 247 |
248 GlobalLockScope::~GlobalLockScope() { | 248 GlobalLockScope::~GlobalLockScope() { |
249 lock_->Unlock(); | 249 lock_->Unlock(); |
250 } | 250 } |
251 | 251 |
252 } // namespace rtc | 252 } // namespace rtc |
OLD | NEW |