blob: c4d5cb1117cc4172e1f3da19484bc20060533694 [file] [log] [blame]
// 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