1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2015 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkMutex_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkMutex_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkDebug.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkSemaphore.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkThreadAnnotations.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkThreadID.h" 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker class SK_CAPABILITY("mutex") SkMutex { 18*c8dee2aaSAndroid Build Coastguard Worker public: 19*c8dee2aaSAndroid Build Coastguard Worker constexpr SkMutex() = default; 20*c8dee2aaSAndroid Build Coastguard Worker ~SkMutex()21*c8dee2aaSAndroid Build Coastguard Worker ~SkMutex() { 22*c8dee2aaSAndroid Build Coastguard Worker this->assertNotHeld(); 23*c8dee2aaSAndroid Build Coastguard Worker } 24*c8dee2aaSAndroid Build Coastguard Worker acquire()25*c8dee2aaSAndroid Build Coastguard Worker void acquire() SK_ACQUIRE() { 26*c8dee2aaSAndroid Build Coastguard Worker fSemaphore.wait(); 27*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(fOwner = SkGetThreadID();) 28*c8dee2aaSAndroid Build Coastguard Worker } 29*c8dee2aaSAndroid Build Coastguard Worker release()30*c8dee2aaSAndroid Build Coastguard Worker void release() SK_RELEASE_CAPABILITY() { 31*c8dee2aaSAndroid Build Coastguard Worker this->assertHeld(); 32*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(fOwner = kIllegalThreadID;) 33*c8dee2aaSAndroid Build Coastguard Worker fSemaphore.signal(); 34*c8dee2aaSAndroid Build Coastguard Worker } 35*c8dee2aaSAndroid Build Coastguard Worker assertHeld()36*c8dee2aaSAndroid Build Coastguard Worker void assertHeld() SK_ASSERT_CAPABILITY(this) { 37*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fOwner == SkGetThreadID()); 38*c8dee2aaSAndroid Build Coastguard Worker } 39*c8dee2aaSAndroid Build Coastguard Worker assertNotHeld()40*c8dee2aaSAndroid Build Coastguard Worker void assertNotHeld() { 41*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fOwner == kIllegalThreadID); 42*c8dee2aaSAndroid Build Coastguard Worker } 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Worker private: 45*c8dee2aaSAndroid Build Coastguard Worker SkSemaphore fSemaphore{1}; 46*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(SkThreadID fOwner{kIllegalThreadID};) 47*c8dee2aaSAndroid Build Coastguard Worker }; 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker class SK_SCOPED_CAPABILITY SkAutoMutexExclusive { 50*c8dee2aaSAndroid Build Coastguard Worker public: SkAutoMutexExclusive(SkMutex & mutex)51*c8dee2aaSAndroid Build Coastguard Worker SkAutoMutexExclusive(SkMutex& mutex) SK_ACQUIRE(mutex) : fMutex(mutex) { fMutex.acquire(); } SK_RELEASE_CAPABILITY()52*c8dee2aaSAndroid Build Coastguard Worker ~SkAutoMutexExclusive() SK_RELEASE_CAPABILITY() { fMutex.release(); } 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker SkAutoMutexExclusive(const SkAutoMutexExclusive&) = delete; 55*c8dee2aaSAndroid Build Coastguard Worker SkAutoMutexExclusive(SkAutoMutexExclusive&&) = delete; 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker SkAutoMutexExclusive& operator=(const SkAutoMutexExclusive&) = delete; 58*c8dee2aaSAndroid Build Coastguard Worker SkAutoMutexExclusive& operator=(SkAutoMutexExclusive&&) = delete; 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker private: 61*c8dee2aaSAndroid Build Coastguard Worker SkMutex& fMutex; 62*c8dee2aaSAndroid Build Coastguard Worker }; 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker #endif // SkMutex_DEFINED 65