1 #include "SkThread.h" 2 3 #include <pthread.h> 4 #include <errno.h> 5 6 SkMutex gAtomicMutex; 7 8 int32_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 17 int32_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 28 static 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 45 SkMutex::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 65 SkMutex::~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 77 void SkMutex::acquire() 78 { 79 int status = pthread_mutex_lock((pthread_mutex_t*)fStorage); 80 print_pthread_error(status); 81 SkASSERT(0 == status); 82 } 83 84 void 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