Chromium Code Reviews| Index: third_party/mojo/src/mojo/edk/system/mutex.h |
| diff --git a/third_party/mojo/src/mojo/edk/system/mutex.h b/third_party/mojo/src/mojo/edk/system/mutex.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..acb410aafef6733afe5e36d0bf79d312e10d973d |
| --- /dev/null |
| +++ b/third_party/mojo/src/mojo/edk/system/mutex.h |
| @@ -0,0 +1,93 @@ |
| +// Copyright 2015 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. |
| + |
| +// A mutex class, with support for thread annotations. |
| +// |
| +// TODO(vtl): Currently, this is a fork of Chromium's |
| +// base/synchronization/lock.h (with names changed and minor modifications; it |
| +// still cheats and uses Chromium's lock_impl.*), but eventually we'll want our |
| +// own and, e.g., add support for non-exclusive (reader) locks. |
| + |
| +#ifndef MOJO_EDK_SYSTEM_MUTEX_H_ |
| +#define MOJO_EDK_SYSTEM_MUTEX_H_ |
| + |
| +#include "base/synchronization/lock_impl.h" |
| +#include "base/threading/platform_thread.h" |
| +#include "mojo/edk/system/system_impl_export.h" |
| +#include "mojo/edk/system/thread_annotations.h" |
| +#include "mojo/public/cpp/system/macros.h" |
| + |
| +namespace mojo { |
| +namespace system { |
| + |
| +// Mutex ----------------------------------------------------------------------- |
| + |
| +class MOJO_SYSTEM_IMPL_EXPORT MOJO_LOCKABLE Mutex { |
|
hans
2015/08/24 20:44:14
This is failing to compile with Clang on Windows:
|
| + public: |
| +#if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON) |
| + Mutex() : lock_() {} |
| + ~Mutex() {} |
| + |
| + void Lock() MOJO_EXCLUSIVE_LOCK_FUNCTION() { lock_.Lock(); } |
| + void Unlock() MOJO_UNLOCK_FUNCTION() { lock_.Unlock(); } |
| + |
| + bool TryLock() MOJO_EXCLUSIVE_TRYLOCK_FUNCTION(true) { return lock_.Try(); } |
| + |
| + void AssertHeld() const MOJO_ASSERT_EXCLUSIVE_LOCK() {} |
| +#else |
| + Mutex(); |
| + ~Mutex(); |
| + |
| + void Lock() MOJO_EXCLUSIVE_LOCK_FUNCTION() { |
| + lock_.Lock(); |
| + CheckUnheldAndMark(); |
| + } |
| + void Unlock() MOJO_UNLOCK_FUNCTION() { |
| + CheckHeldAndUnmark(); |
| + lock_.Unlock(); |
| + } |
| + |
| + bool TryLock() MOJO_EXCLUSIVE_TRYLOCK_FUNCTION(true) { |
| + bool rv = lock_.Try(); |
| + if (rv) |
| + CheckUnheldAndMark(); |
| + return rv; |
| + } |
| + |
| + void AssertHeld() const MOJO_ASSERT_EXCLUSIVE_LOCK(); |
| +#endif // NDEBUG && !DCHECK_ALWAYS_ON |
| + |
| + private: |
| +#if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON) |
| + void CheckHeldAndUnmark(); |
| + void CheckUnheldAndMark(); |
| + |
| + base::PlatformThreadRef owning_thread_ref_; |
| +#endif // !NDEBUG || DCHECK_ALWAYS_ON |
| + |
| + base::internal::LockImpl lock_; |
| + |
| + MOJO_DISALLOW_COPY_AND_ASSIGN(Mutex); |
| +}; |
| + |
| +// MutexLocker ----------------------------------------------------------------- |
| + |
| +class MOJO_SYSTEM_IMPL_EXPORT MOJO_SCOPED_LOCKABLE MutexLocker { |
| + public: |
| + explicit MutexLocker(Mutex* mutex) MOJO_EXCLUSIVE_LOCK_FUNCTION(mutex) |
| + : mutex_(mutex) { |
| + this->mutex_->Lock(); |
| + } |
| + ~MutexLocker() MOJO_UNLOCK_FUNCTION() { this->mutex_->Unlock(); } |
| + |
| + private: |
| + Mutex* const mutex_; |
| + |
| + MOJO_DISALLOW_COPY_AND_ASSIGN(MutexLocker); |
| +}; |
| + |
| +} // namespace system |
| +} // namespace mojo |
| + |
| +#endif // MOJO_EDK_SYSTEM_MUTEX_H_ |