diff options
Diffstat (limited to 'chromium/gpu/command_buffer/client/atomicops.cc')
-rw-r--r-- | chromium/gpu/command_buffer/client/atomicops.cc | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/chromium/gpu/command_buffer/client/atomicops.cc b/chromium/gpu/command_buffer/client/atomicops.cc new file mode 100644 index 00000000000..c4d5cb1117c --- /dev/null +++ b/chromium/gpu/command_buffer/client/atomicops.cc @@ -0,0 +1,99 @@ +// Copyright (c) 2012 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. + +#include "gpu/command_buffer/client/atomicops.h" +#include "gpu/command_buffer/common/logging.h" + +#if !defined(__native_client__) +#include "base/atomicops.h" +#include "base/synchronization/lock.h" +#else +#include <pthread.h> +#endif + +namespace gpu { + +void MemoryBarrier() { +#if defined(__native_client__) + __sync_synchronize(); +#else + base::subtle::MemoryBarrier(); +#endif +} + +#if defined(__native_client__) + +class LockImpl { + public: + LockImpl() + : acquired_(false) { + pthread_mutex_init(&mutex_, NULL); + } + + ~LockImpl() { + pthread_mutex_destroy(&mutex_); + } + + void Acquire() { + pthread_mutex_lock(&mutex_); + acquired_ = true; + } + + void Release() { + GPU_DCHECK(acquired_); + acquired_ = false; + pthread_mutex_unlock(&mutex_); + } + + bool Try() { + bool acquired = pthread_mutex_trylock(&mutex_) == 0; + if (acquired) { + acquired_ = true; + } + return acquired; + } + + void AssertAcquired() const { + GPU_DCHECK(acquired_); + } + + private: + bool acquired_; + pthread_mutex_t mutex_; + + DISALLOW_COPY_AND_ASSIGN(LockImpl); +}; + +#else // !__native_client__ + +class LockImpl : public base::Lock { +}; + +#endif // !__native_client__ + +Lock::Lock() + : lock_(new LockImpl()) { +} + +Lock::~Lock() { +} + +void Lock::Acquire() { + lock_->Acquire(); +} + +void Lock::Release() { + lock_->Release(); +} + +bool Lock::Try() { + return lock_->Try(); +} + +void Lock::AssertAcquired() const { + return lock_->AssertAcquired(); +} + +} // namespace gpu + |