diff --git a/src/ports/SkMutex_pthread.h b/src/ports/SkMutex_pthread.h index 662e549f12..f71016b31e 100644 --- a/src/ports/SkMutex_pthread.h +++ b/src/ports/SkMutex_pthread.h @@ -13,23 +13,27 @@ #include #include +// This isn't technically portable, but on Linux and Android pthread_t is some sort of int, and +// on Darwin it's a pointer. So assuming pthread_self() never returns 0, it works as a sentinel. +SkDEBUGCODE(static const pthread_t kNoOwner = 0;) + // A SkBaseMutex is a POD structure that can be directly initialized // at declaration time with SK_DECLARE_STATIC/GLOBAL_MUTEX. This avoids the // generation of a static initializer in the final machine code (and // a corresponding static finalizer). struct SkBaseMutex { void acquire() { - SkASSERT(fOwner != pthread_self()); // SkMutex is not re-entrant + SkASSERT(0 == pthread_equal(fOwner, pthread_self())); // SkMutex is not re-entrant pthread_mutex_lock(&fMutex); SkDEBUGCODE(fOwner = pthread_self();) } void release() { this->assertHeld(); - SkDEBUGCODE(fOwner = 0;) + SkDEBUGCODE(fOwner = kNoOwner;) pthread_mutex_unlock(&fMutex); } void assertHeld() { - SkASSERT(pthread_self() == fOwner); + SkASSERT(0 != pthread_equal(fOwner, pthread_self())); } pthread_mutex_t fMutex; @@ -47,6 +51,7 @@ public: print_pthread_error(status); SkASSERT(0 == status); } + fOwner = kNoOwner; ) }