a669bc7a7a
This merges and refactors SkAtomics.h and SkBarriers.h into SkAtomics.h and some ports/ implementations. The major new feature is that we can express memory orders explicitly rather than only through comments. The porting layer is reduced to four template functions: - sk_atomic_load - sk_atomic_store - sk_atomic_fetch_add - sk_atomic_compare_exchange From those four we can reconstruct all our previous sk_atomic_foo. There are three ports: - SkAtomics_std: uses C++11 <atomic>, used with MSVC - SkAtomics_atomic: uses newer GCC/Clang intrinsics, used on not-MSVC where possible - SkAtomics_sync: uses older GCC/Clang intrinsics, used where SkAtomics_atomic not supported No public API changes. TBR=reed@google.com BUG=skia: Review URL: https://codereview.chromium.org/896553002
54 lines
1.2 KiB
C++
54 lines
1.2 KiB
C++
#ifndef SkMutex_DEFINED
|
|
#define SkMutex_DEFINED
|
|
|
|
// This file is not part of the public Skia API.
|
|
#include "SkTypes.h"
|
|
|
|
#if defined(SK_BUILD_FOR_WIN)
|
|
#include "../ports/SkMutex_win.h"
|
|
#else
|
|
#include "../ports/SkMutex_pthread.h"
|
|
#endif
|
|
|
|
class SkAutoMutexAcquire : SkNoncopyable {
|
|
public:
|
|
explicit SkAutoMutexAcquire(SkBaseMutex& mutex) : fMutex(&mutex) {
|
|
SkASSERT(fMutex != NULL);
|
|
mutex.acquire();
|
|
}
|
|
|
|
explicit SkAutoMutexAcquire(SkBaseMutex* mutex) : fMutex(mutex) {
|
|
if (mutex) {
|
|
mutex->acquire();
|
|
}
|
|
}
|
|
|
|
/** If the mutex has not been released, release it now. */
|
|
~SkAutoMutexAcquire() {
|
|
if (fMutex) {
|
|
fMutex->release();
|
|
}
|
|
}
|
|
|
|
/** If the mutex has not been released, release it now. */
|
|
void release() {
|
|
if (fMutex) {
|
|
fMutex->release();
|
|
fMutex = NULL;
|
|
}
|
|
}
|
|
|
|
/** Assert that we're holding the mutex. */
|
|
void assertHeld() {
|
|
SkASSERT(fMutex);
|
|
fMutex->assertHeld();
|
|
}
|
|
|
|
private:
|
|
SkBaseMutex* fMutex;
|
|
};
|
|
#define SkAutoMutexAcquire(...) SK_REQUIRE_LOCAL_VAR(SkAutoMutexAcquire)
|
|
|
|
|
|
#endif//SkMutex_DEFINED
|