blob: 948cf1fc21b16a0e9a8330bd1aba563cb288651e [file] [log] [blame]
// Copyright (c) 2010 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 "third_party/skia/include/core/SkThread.h"
#include <new>
#include "base/atomicops.h"
#include "base/basictypes.h"
#include "base/logging.h"
#include "base/synchronization/lock.h"
int32_t sk_atomic_inc(int32_t* addr) {
// sk_atomic_inc is expected to return the old value, Barrier_AtomicIncrement
// returns the new value.
return base::subtle::Barrier_AtomicIncrement(addr, 1) - 1;
}
int32_t sk_atomic_dec(int32_t* addr) {
// sk_atomic_dec is expected to return the old value, Barrier_AtomicIncrement
// returns the new value.
return base::subtle::Barrier_AtomicIncrement(addr, -1) + 1;
}
SkMutex::SkMutex(bool isGlobal) : fIsGlobal(isGlobal) {
COMPILE_ASSERT(sizeof(base::Lock) <= sizeof(fStorage), Lock_is_too_big_for_SkMutex);
base::Lock* lock = reinterpret_cast<base::Lock*>(fStorage);
new(lock) base::Lock();
}
SkMutex::~SkMutex() {
base::Lock* lock = reinterpret_cast<base::Lock*>(fStorage);
lock->~Lock();
}
void SkMutex::acquire() {
base::Lock* lock = reinterpret_cast<base::Lock*>(fStorage);
lock->Acquire();
}
void SkMutex::release() {
base::Lock* lock = reinterpret_cast<base::Lock*>(fStorage);
lock->Release();
}