diff options
Diffstat (limited to 'libsgl/ports/SkThread_pthread.cpp')
-rw-r--r-- | libsgl/ports/SkThread_pthread.cpp | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/libsgl/ports/SkThread_pthread.cpp b/libsgl/ports/SkThread_pthread.cpp new file mode 100644 index 0000000..4ee857d --- /dev/null +++ b/libsgl/ports/SkThread_pthread.cpp @@ -0,0 +1,90 @@ +#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); +} + |