| 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>
|
|
|