033da99803
The automatic copy and move constructors and such are not appropriate for this type. It could be refactored to be movable but not copyable, but as written it's neither. Change-Id: I398a1f91238530c7a6ae2aaf3e7e8455691655fa Reviewed-on: https://skia-review.googlesource.com/c/skia/+/377536 Reviewed-by: Mike Klein <mtklein@google.com> Commit-Queue: Mike Klein <mtklein@google.com>
57 lines
1.5 KiB
C++
57 lines
1.5 KiB
C++
/*
|
|
* Copyright 2015 Google Inc.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#ifndef SkMutex_DEFINED
|
|
#define SkMutex_DEFINED
|
|
|
|
#include "include/core/SkTypes.h"
|
|
#include "include/private/SkMacros.h"
|
|
#include "include/private/SkSemaphore.h"
|
|
#include "include/private/SkThreadAnnotations.h"
|
|
#include "include/private/SkThreadID.h"
|
|
|
|
class SK_CAPABILITY("mutex") SkMutex {
|
|
public:
|
|
constexpr SkMutex() = default;
|
|
|
|
void acquire() SK_ACQUIRE() {
|
|
fSemaphore.wait();
|
|
SkDEBUGCODE(fOwner = SkGetThreadID();)
|
|
}
|
|
|
|
void release() SK_RELEASE_CAPABILITY() {
|
|
this->assertHeld();
|
|
SkDEBUGCODE(fOwner = kIllegalThreadID;)
|
|
fSemaphore.signal();
|
|
}
|
|
|
|
void assertHeld() SK_ASSERT_CAPABILITY(this) {
|
|
SkASSERT(fOwner == SkGetThreadID());
|
|
}
|
|
|
|
private:
|
|
SkSemaphore fSemaphore{1};
|
|
SkDEBUGCODE(SkThreadID fOwner{kIllegalThreadID};)
|
|
};
|
|
|
|
class SK_SCOPED_CAPABILITY SkAutoMutexExclusive {
|
|
public:
|
|
SkAutoMutexExclusive(SkMutex& mutex) SK_ACQUIRE(mutex) : fMutex(mutex) { fMutex.acquire(); }
|
|
~SkAutoMutexExclusive() SK_RELEASE_CAPABILITY() { fMutex.release(); }
|
|
|
|
SkAutoMutexExclusive(const SkAutoMutexExclusive&) = delete;
|
|
SkAutoMutexExclusive(SkAutoMutexExclusive&&) = delete;
|
|
|
|
SkAutoMutexExclusive& operator=(const SkAutoMutexExclusive&) = delete;
|
|
SkAutoMutexExclusive& operator=(SkAutoMutexExclusive&&) = delete;
|
|
|
|
private:
|
|
SkMutex& fMutex;
|
|
};
|
|
|
|
#endif // SkMutex_DEFINED
|