Index: include/private/SkMutex.h |
diff --git a/include/private/SkMutex.h b/include/private/SkMutex.h |
index 8c78e1205c8796261be4b19468338a00af8afdc5..3b0e1c47ca16e34cbeeb6e2b7b3b12d006815670 100644 |
--- a/include/private/SkMutex.h |
+++ b/include/private/SkMutex.h |
@@ -8,33 +8,16 @@ |
#ifndef SkMutex_DEFINED |
#define SkMutex_DEFINED |
-// This file is not part of the public Skia API. |
#include "../private/SkSemaphore.h" |
+#include "../private/SkThreadID.h" |
#include "SkTypes.h" |
-#ifdef SK_DEBUG |
- #include "../private/SkThreadID.h" |
-#endif |
- |
-#define SK_MUTEX_SEMAPHORE_INIT {1, {0}} |
- |
-#ifdef SK_DEBUG |
- #define SK_BASE_MUTEX_INIT {SK_MUTEX_SEMAPHORE_INIT, 0} |
-#else |
- #define SK_BASE_MUTEX_INIT {SK_MUTEX_SEMAPHORE_INIT} |
-#endif |
- |
-// Using POD-style initialization prevents the generation of a static initializer. |
-// |
-// Without magic statics there are no thread safety guarantees on initialization |
-// of local statics (even POD). As a result, it is illegal to use |
-// SK_DECLARE_STATIC_MUTEX in a function. |
-// |
-// Because SkBaseMutex is not a primitive, a static SkBaseMutex cannot be |
-// initialized in a class with this macro. |
-#define SK_DECLARE_STATIC_MUTEX(name) namespace {} static SkBaseMutex name = SK_BASE_MUTEX_INIT; |
- |
-struct SkBaseMutex { |
+#define SK_DECLARE_STATIC_MUTEX(name) static SkBaseMutex name; |
+ |
+class SkBaseMutex { |
+public: |
+ constexpr SkBaseMutex() = default; |
+ |
void acquire() { |
fSemaphore.wait(); |
SkDEBUGCODE(fOwner = SkGetThreadID();) |
@@ -50,20 +33,15 @@ struct SkBaseMutex { |
SkASSERT(fOwner == SkGetThreadID()); |
} |
- SkBaseSemaphore fSemaphore; |
- SkDEBUGCODE(SkThreadID fOwner;) |
+protected: |
+ SkBaseSemaphore fSemaphore{1}; |
+ SkDEBUGCODE(SkThreadID fOwner{kIllegalThreadID};) |
}; |
-// This needs to use subclassing instead of encapsulation to make SkAutoMutexAcquire to work. |
class SkMutex : public SkBaseMutex { |
public: |
- SkMutex () { |
- fSemaphore = SK_MUTEX_SEMAPHORE_INIT; |
- SkDEBUGCODE(fOwner = kIllegalThreadID); |
- } |
- ~SkMutex () { fSemaphore.deleteSemaphore(); } |
- SkMutex(const SkMutex&) = delete; |
- SkMutex& operator=(const SkMutex&) = delete; |
+ using SkBaseMutex::SkBaseMutex; |
+ ~SkMutex() { fSemaphore.cleanup(); } |
}; |
template <typename Lock> |