1#include "SkThread.h" 2 3#include <pthread.h> 4#include <errno.h> 5 6SkMutex gAtomicMutex; 7 8int32_t sk_atomic_inc(int32_t* addr) 9{ 10 SkAutoMutexAcquire ac(gAtomicMutex); 11 12 int32_t value = *addr; 13 *addr = value + 1; 14 return value; 15} 16 17int32_t sk_atomic_dec(int32_t* addr) 18{ 19 SkAutoMutexAcquire ac(gAtomicMutex); 20 21 int32_t value = *addr; 22 *addr = value - 1; 23 return value; 24} 25 26////////////////////////////////////////////////////////////////////////////// 27 28static void print_pthread_error(int status) 29{ 30 switch (status) { 31 case 0: // success 32 break; 33 case EINVAL: 34 printf("pthread error [%d] EINVAL\n", status); 35 break; 36 case EBUSY: 37 printf("pthread error [%d] EBUSY\n", status); 38 break; 39 default: 40 printf("pthread error [%d] unknown\n", status); 41 break; 42 } 43} 44 45SkMutex::SkMutex(bool isGlobal) : fIsGlobal(isGlobal) 46{ 47 if (sizeof(pthread_mutex_t) > sizeof(fStorage)) 48 { 49 SkDEBUGF(("pthread mutex size = %d\n", sizeof(pthread_mutex_t))); 50 SkASSERT(!"mutex storage is too small"); 51 } 52 53 int status; 54 pthread_mutexattr_t attr; 55 56 status = pthread_mutexattr_init(&attr); 57 print_pthread_error(status); 58 SkASSERT(0 == status); 59 60 status = pthread_mutex_init((pthread_mutex_t*)fStorage, &attr); 61 print_pthread_error(status); 62 SkASSERT(0 == status); 63} 64 65SkMutex::~SkMutex() 66{ 67 int status = pthread_mutex_destroy((pthread_mutex_t*)fStorage); 68 69 // only report errors on non-global mutexes 70 if (!fIsGlobal) 71 { 72 print_pthread_error(status); 73 SkASSERT(0 == status); 74 } 75} 76 77void SkMutex::acquire() 78{ 79 int status = pthread_mutex_lock((pthread_mutex_t*)fStorage); 80 print_pthread_error(status); 81 SkASSERT(0 == status); 82} 83 84void SkMutex::release() 85{ 86 int status = pthread_mutex_unlock((pthread_mutex_t*)fStorage); 87 print_pthread_error(status); 88 SkASSERT(0 == status); 89} 90 91