diff options
author | initial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-07-27 00:09:42 +0000 |
---|---|---|
committer | initial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-07-27 00:09:42 +0000 |
commit | ae2c20f398933a9e86c387dcc465ec0f71065ffc (patch) | |
tree | de668b1411e2ee0b4e49b6d8f8b68183134ac990 /skia/ports/SkThread_pthread.cpp | |
parent | 09911bf300f1a419907a9412154760efd0b7abc3 (diff) | |
download | chromium_src-ae2c20f398933a9e86c387dcc465ec0f71065ffc.zip chromium_src-ae2c20f398933a9e86c387dcc465ec0f71065ffc.tar.gz chromium_src-ae2c20f398933a9e86c387dcc465ec0f71065ffc.tar.bz2 |
Add skia to the repository.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@16 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'skia/ports/SkThread_pthread.cpp')
-rw-r--r-- | skia/ports/SkThread_pthread.cpp | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/skia/ports/SkThread_pthread.cpp b/skia/ports/SkThread_pthread.cpp new file mode 100644 index 0000000..4ee857d --- /dev/null +++ b/skia/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); +} + |