Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(344)

Unified Diff: webrtc/base/criticalsection.cc

Issue 2877023002: Move webrtc/{base => rtc_base} (Closed)
Patch Set: update presubmit.py and DEPS include rules Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/base/criticalsection.h ('k') | webrtc/base/criticalsection_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/base/criticalsection.cc
diff --git a/webrtc/base/criticalsection.cc b/webrtc/base/criticalsection.cc
deleted file mode 100644
index 5a7bc762a79f4376125fb289084cde75c5aa0d69..0000000000000000000000000000000000000000
--- a/webrtc/base/criticalsection.cc
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * Copyright 2015 The WebRTC Project Authors. All rights reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "webrtc/base/criticalsection.h"
-
-#include "webrtc/base/checks.h"
-#include "webrtc/base/platform_thread.h"
-
-// TODO(tommi): Split this file up to per-platform implementation files.
-
-namespace rtc {
-
-CriticalSection::CriticalSection() {
-#if defined(WEBRTC_WIN)
- InitializeCriticalSection(&crit_);
-#elif defined(WEBRTC_POSIX)
-# if defined(WEBRTC_MAC) && !USE_NATIVE_MUTEX_ON_MAC
- lock_queue_ = 0;
- owning_thread_ = 0;
- recursion_ = 0;
- semaphore_ = dispatch_semaphore_create(0);
-# else
- pthread_mutexattr_t mutex_attribute;
- pthread_mutexattr_init(&mutex_attribute);
- pthread_mutexattr_settype(&mutex_attribute, PTHREAD_MUTEX_RECURSIVE);
- pthread_mutex_init(&mutex_, &mutex_attribute);
- pthread_mutexattr_destroy(&mutex_attribute);
-# endif
- CS_DEBUG_CODE(thread_ = 0);
- CS_DEBUG_CODE(recursion_count_ = 0);
- RTC_UNUSED(thread_);
- RTC_UNUSED(recursion_count_);
-#else
-# error Unsupported platform.
-#endif
-}
-
-CriticalSection::~CriticalSection() {
-#if defined(WEBRTC_WIN)
- DeleteCriticalSection(&crit_);
-#elif defined(WEBRTC_POSIX)
-# if defined(WEBRTC_MAC) && !USE_NATIVE_MUTEX_ON_MAC
- dispatch_release(semaphore_);
-# else
- pthread_mutex_destroy(&mutex_);
-# endif
-#else
-# error Unsupported platform.
-#endif
-}
-
-void CriticalSection::Enter() const EXCLUSIVE_LOCK_FUNCTION() {
-#if defined(WEBRTC_WIN)
- EnterCriticalSection(&crit_);
-#elif defined(WEBRTC_POSIX)
-# if defined(WEBRTC_MAC) && !USE_NATIVE_MUTEX_ON_MAC
- int spin = 3000;
- PlatformThreadRef self = CurrentThreadRef();
- bool have_lock = false;
- do {
- // Instead of calling TryEnter() in this loop, we do two interlocked
- // operations, first a read-only one in order to avoid affecting the lock
- // cache-line while spinning, in case another thread is using the lock.
- if (!IsThreadRefEqual(owning_thread_, self)) {
- if (AtomicOps::AcquireLoad(&lock_queue_) == 0) {
- if (AtomicOps::CompareAndSwap(&lock_queue_, 0, 1) == 0) {
- have_lock = true;
- break;
- }
- }
- } else {
- AtomicOps::Increment(&lock_queue_);
- have_lock = true;
- break;
- }
-
- sched_yield();
- } while (--spin);
-
- if (!have_lock && AtomicOps::Increment(&lock_queue_) > 1) {
- // Owning thread cannot be the current thread since TryEnter() would
- // have succeeded.
- RTC_DCHECK(!IsThreadRefEqual(owning_thread_, self));
- // Wait for the lock to become available.
- dispatch_semaphore_wait(semaphore_, DISPATCH_TIME_FOREVER);
- RTC_DCHECK(owning_thread_ == 0);
- RTC_DCHECK(!recursion_);
- }
-
- owning_thread_ = self;
- ++recursion_;
-
-# else
- pthread_mutex_lock(&mutex_);
-# endif
-
-# if CS_DEBUG_CHECKS
- if (!recursion_count_) {
- RTC_DCHECK(!thread_);
- thread_ = CurrentThreadRef();
- } else {
- RTC_DCHECK(CurrentThreadIsOwner());
- }
- ++recursion_count_;
-# endif
-#else
-# error Unsupported platform.
-#endif
-}
-
-bool CriticalSection::TryEnter() const EXCLUSIVE_TRYLOCK_FUNCTION(true) {
-#if defined(WEBRTC_WIN)
- return TryEnterCriticalSection(&crit_) != FALSE;
-#elif defined(WEBRTC_POSIX)
-# if defined(WEBRTC_MAC) && !USE_NATIVE_MUTEX_ON_MAC
- if (!IsThreadRefEqual(owning_thread_, CurrentThreadRef())) {
- if (AtomicOps::CompareAndSwap(&lock_queue_, 0, 1) != 0)
- return false;
- owning_thread_ = CurrentThreadRef();
- RTC_DCHECK(!recursion_);
- } else {
- AtomicOps::Increment(&lock_queue_);
- }
- ++recursion_;
-# else
- if (pthread_mutex_trylock(&mutex_) != 0)
- return false;
-# endif
-# if CS_DEBUG_CHECKS
- if (!recursion_count_) {
- RTC_DCHECK(!thread_);
- thread_ = CurrentThreadRef();
- } else {
- RTC_DCHECK(CurrentThreadIsOwner());
- }
- ++recursion_count_;
-# endif
- return true;
-#else
-# error Unsupported platform.
-#endif
-}
-
-void CriticalSection::Leave() const UNLOCK_FUNCTION() {
- RTC_DCHECK(CurrentThreadIsOwner());
-#if defined(WEBRTC_WIN)
- LeaveCriticalSection(&crit_);
-#elif defined(WEBRTC_POSIX)
-# if CS_DEBUG_CHECKS
- --recursion_count_;
- RTC_DCHECK(recursion_count_ >= 0);
- if (!recursion_count_)
- thread_ = 0;
-# endif
-# if defined(WEBRTC_MAC) && !USE_NATIVE_MUTEX_ON_MAC
- RTC_DCHECK(IsThreadRefEqual(owning_thread_, CurrentThreadRef()));
- RTC_DCHECK_GE(recursion_, 0);
- --recursion_;
- if (!recursion_)
- owning_thread_ = 0;
-
- if (AtomicOps::Decrement(&lock_queue_) > 0 && !recursion_)
- dispatch_semaphore_signal(semaphore_);
-# else
- pthread_mutex_unlock(&mutex_);
-# endif
-#else
-# error Unsupported platform.
-#endif
-}
-
-bool CriticalSection::CurrentThreadIsOwner() const {
-#if defined(WEBRTC_WIN)
- // OwningThread has type HANDLE but actually contains the Thread ID:
- // http://stackoverflow.com/questions/12675301/why-is-the-owningthread-member-of-critical-section-of-type-handle-when-it-is-de
- // Converting through size_t avoids the VS 2015 warning C4312: conversion from
- // 'type1' to 'type2' of greater size
- return crit_.OwningThread ==
- reinterpret_cast<HANDLE>(static_cast<size_t>(GetCurrentThreadId()));
-#elif defined(WEBRTC_POSIX)
-# if CS_DEBUG_CHECKS
- return IsThreadRefEqual(thread_, CurrentThreadRef());
-# else
- return true;
-# endif // CS_DEBUG_CHECKS
-#else
-# error Unsupported platform.
-#endif
-}
-
-CritScope::CritScope(const CriticalSection* cs) : cs_(cs) { cs_->Enter(); }
-CritScope::~CritScope() { cs_->Leave(); }
-
-TryCritScope::TryCritScope(const CriticalSection* cs)
- : cs_(cs), locked_(cs->TryEnter()) {
- CS_DEBUG_CODE(lock_was_called_ = false);
- RTC_UNUSED(lock_was_called_);
-}
-
-TryCritScope::~TryCritScope() {
- CS_DEBUG_CODE(RTC_DCHECK(lock_was_called_));
- if (locked_)
- cs_->Leave();
-}
-
-bool TryCritScope::locked() const {
- CS_DEBUG_CODE(lock_was_called_ = true);
- return locked_;
-}
-
-void GlobalLockPod::Lock() {
-#if !defined(WEBRTC_WIN) && (!defined(WEBRTC_MAC) || USE_NATIVE_MUTEX_ON_MAC)
- const struct timespec ts_null = {0};
-#endif
-
- while (AtomicOps::CompareAndSwap(&lock_acquired, 0, 1)) {
-#if defined(WEBRTC_WIN)
- ::Sleep(0);
-#elif defined(WEBRTC_MAC) && !USE_NATIVE_MUTEX_ON_MAC
- sched_yield();
-#else
- nanosleep(&ts_null, nullptr);
-#endif
- }
-}
-
-void GlobalLockPod::Unlock() {
- int old_value = AtomicOps::CompareAndSwap(&lock_acquired, 1, 0);
- RTC_DCHECK_EQ(1, old_value) << "Unlock called without calling Lock first";
-}
-
-GlobalLock::GlobalLock() {
- lock_acquired = 0;
-}
-
-GlobalLockScope::GlobalLockScope(GlobalLockPod* lock)
- : lock_(lock) {
- lock_->Lock();
-}
-
-GlobalLockScope::~GlobalLockScope() {
- lock_->Unlock();
-}
-
-} // namespace rtc
« no previous file with comments | « webrtc/base/criticalsection.h ('k') | webrtc/base/criticalsection_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698