#include "SkThread.h" #include <pthread.h> #include <errno.h> SkMutex gAtomicMutex; int32_t sk_atomic_inc(int32_t* addr) { SkAutoMutexAcquire ac(gAtomicMutex); int32_t value = *addr; *addr = value + 1; return value; } int32_t sk_atomic_dec(int32_t* addr) { SkAutoMutexAcquire ac(gAtomicMutex); int32_t value = *addr; *addr = value - 1; return value; } ////////////////////////////////////////////////////////////////////////////// static void print_pthread_error(int status) { switch (status) { case 0: // success break; case EINVAL: printf("pthread error [%d] EINVAL\n", status); break; case EBUSY: printf("pthread error [%d] EBUSY\n", status); break; default: printf("pthread error [%d] unknown\n", status); break; } } SkMutex::SkMutex(bool isGlobal) : fIsGlobal(isGlobal) { if (sizeof(pthread_mutex_t) > sizeof(fStorage)) { SkDEBUGF(("pthread mutex size = %d\n", sizeof(pthread_mutex_t))); SkASSERT(!"mutex storage is too small"); } int status; pthread_mutexattr_t attr; status = pthread_mutexattr_init(&attr); print_pthread_error(status); SkASSERT(0 == status); status = pthread_mutex_init((pthread_mutex_t*)fStorage, &attr); print_pthread_error(status); SkASSERT(0 == status); } SkMutex::~SkMutex() { int status = pthread_mutex_destroy((pthread_mutex_t*)fStorage); // only report errors on non-global mutexes if (!fIsGlobal) { print_pthread_error(status); SkASSERT(0 == status); } } void SkMutex::acquire() { int status = pthread_mutex_lock((pthread_mutex_t*)fStorage); print_pthread_error(status); SkASSERT(0 == status); } void SkMutex::release() { int status = pthread_mutex_unlock((pthread_mutex_t*)fStorage); print_pthread_error(status); SkASSERT(0 == status); }