summaryrefslogtreecommitdiff
path: root/chromium/gpu/command_buffer/client/atomicops.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/gpu/command_buffer/client/atomicops.cc')
-rw-r--r--chromium/gpu/command_buffer/client/atomicops.cc99
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
+