| Index: third_party/libphonenumber/cpp/src/base/synchronization/lock.h
|
| ===================================================================
|
| --- third_party/libphonenumber/cpp/src/base/synchronization/lock.h (revision 0)
|
| +++ third_party/libphonenumber/cpp/src/base/synchronization/lock.h (revision 0)
|
| @@ -0,0 +1,131 @@
|
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef BASE_SYNCHRONIZATION_LOCK_H_
|
| +#define BASE_SYNCHRONIZATION_LOCK_H_
|
| +#pragma once
|
| +
|
| +#include "base/synchronization/lock_impl.h"
|
| +#include "base/threading/platform_thread.h"
|
| +
|
| +namespace base {
|
| +
|
| +// A convenient wrapper for an OS specific critical section. The only real
|
| +// intelligence in this class is in debug mode for the support for the
|
| +// AssertAcquired() method.
|
| +class Lock {
|
| + public:
|
| +#if defined(NDEBUG) // Optimized wrapper implementation
|
| + Lock() : lock_() {}
|
| + ~Lock() {}
|
| + void Acquire() { lock_.Lock(); }
|
| + void Release() { lock_.Unlock(); }
|
| +
|
| + // If the lock is not held, take it and return true. If the lock is already
|
| + // held by another thread, immediately return false. This must not be called
|
| + // by a thread already holding the lock (what happens is undefined and an
|
| + // assertion may fail).
|
| + bool Try() { return lock_.Try(); }
|
| +
|
| + // Null implementation if not debug.
|
| + void AssertAcquired() const {}
|
| +#else
|
| + Lock();
|
| + ~Lock() {}
|
| +
|
| + // NOTE: Although windows critical sections support recursive locks, we do not
|
| + // allow this, and we will commonly fire a DCHECK() if a thread attempts to
|
| + // acquire the lock a second time (while already holding it).
|
| + void Acquire() {
|
| + lock_.Lock();
|
| + CheckUnheldAndMark();
|
| + }
|
| + void Release() {
|
| + CheckHeldAndUnmark();
|
| + lock_.Unlock();
|
| + }
|
| +
|
| + bool Try() {
|
| + bool rv = lock_.Try();
|
| + if (rv) {
|
| + CheckUnheldAndMark();
|
| + }
|
| + return rv;
|
| + }
|
| +
|
| + void AssertAcquired() const;
|
| +#endif // NDEBUG
|
| +
|
| +#if defined(OS_POSIX)
|
| + // The posix implementation of ConditionVariable needs to be able
|
| + // to see our lock and tweak our debugging counters, as it releases
|
| + // and acquires locks inside of pthread_cond_{timed,}wait.
|
| + // Windows doesn't need to do this as it calls the Lock::* methods.
|
| + friend class ConditionVariable;
|
| +#endif
|
| +
|
| + private:
|
| +#if !defined(NDEBUG)
|
| + // Members and routines taking care of locks assertions.
|
| + // Note that this checks for recursive locks and allows them
|
| + // if the variable is set. This is allowed by the underlying implementation
|
| + // on windows but not on Posix, so we're doing unneeded checks on Posix.
|
| + // It's worth it to share the code.
|
| + void CheckHeldAndUnmark();
|
| + void CheckUnheldAndMark();
|
| +
|
| + // All private data is implicitly protected by lock_.
|
| + // Be VERY careful to only access members under that lock.
|
| +
|
| + // Determines validity of owning_thread_id_. Needed as we don't have
|
| + // a null owning_thread_id_ value.
|
| + bool owned_by_thread_;
|
| + base::PlatformThreadId owning_thread_id_;
|
| +#endif // NDEBUG
|
| +
|
| + // Platform specific underlying lock implementation.
|
| + internal::LockImpl lock_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(Lock);
|
| +};
|
| +
|
| +// A helper class that acquires the given Lock while the AutoLock is in scope.
|
| +class AutoLock {
|
| + public:
|
| + explicit AutoLock(Lock& lock) : lock_(lock) {
|
| + lock_.Acquire();
|
| + }
|
| +
|
| + ~AutoLock() {
|
| + lock_.AssertAcquired();
|
| + lock_.Release();
|
| + }
|
| +
|
| + private:
|
| + Lock& lock_;
|
| + DISALLOW_COPY_AND_ASSIGN(AutoLock);
|
| +};
|
| +
|
| +// AutoUnlock is a helper that will Release() the |lock| argument in the
|
| +// constructor, and re-Acquire() it in the destructor.
|
| +class AutoUnlock {
|
| + public:
|
| + explicit AutoUnlock(Lock& lock) : lock_(lock) {
|
| + // We require our caller to have the lock.
|
| + lock_.AssertAcquired();
|
| + lock_.Release();
|
| + }
|
| +
|
| + ~AutoUnlock() {
|
| + lock_.Acquire();
|
| + }
|
| +
|
| + private:
|
| + Lock& lock_;
|
| + DISALLOW_COPY_AND_ASSIGN(AutoUnlock);
|
| +};
|
| +
|
| +} // namespace base
|
| +
|
| +#endif // BASE_SYNCHRONIZATION_LOCK_H_
|
|
|
| Property changes on: third_party\libphonenumber\cpp\src\base\synchronization\lock.h
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|