| Index: src/ports/SkThread_pthread.cpp
|
| ===================================================================
|
| --- src/ports/SkThread_pthread.cpp (revision 12696)
|
| +++ src/ports/SkThread_pthread.cpp (working copy)
|
| @@ -1,197 +0,0 @@
|
| -
|
| -/*
|
| - * Copyright 2011 Google Inc.
|
| - *
|
| - * Use of this source code is governed by a BSD-style license that can be
|
| - * found in the LICENSE file.
|
| - */
|
| -#include "SkThread.h"
|
| -
|
| -#include <pthread.h>
|
| -#include <errno.h>
|
| -
|
| -#ifndef SK_BUILD_FOR_ANDROID
|
| -
|
| -/**
|
| - We prefer the GCC intrinsic implementation of the atomic operations over the
|
| - SkMutex-based implementation. The SkMutex version suffers from static
|
| - destructor ordering problems.
|
| - Note clang also defines the GCC version macros and implements the intrinsics.
|
| - TODO: Verify that gcc-style __sync_* intrinsics work on ARM
|
| - According to this the intrinsics are supported on ARM in LLVM 2.7+
|
| - http://llvm.org/releases/2.7/docs/ReleaseNotes.html
|
| -*/
|
| -#if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || __GNUC__ > 4
|
| - #if (defined(__x86_64) || defined(__i386__))
|
| - #define GCC_INTRINSIC
|
| - #endif
|
| -#endif
|
| -
|
| -#if defined(GCC_INTRINSIC)
|
| -
|
| -int32_t sk_atomic_inc(int32_t* addr)
|
| -{
|
| - return __sync_fetch_and_add(addr, 1);
|
| -}
|
| -
|
| -int32_t sk_atomic_add(int32_t* addr, int32_t inc)
|
| -{
|
| - return __sync_fetch_and_add(addr, inc);
|
| -}
|
| -
|
| -int32_t sk_atomic_dec(int32_t* addr)
|
| -{
|
| - return __sync_fetch_and_add(addr, -1);
|
| -}
|
| -void sk_membar_aquire__after_atomic_dec() { }
|
| -
|
| -int32_t sk_atomic_conditional_inc(int32_t* addr)
|
| -{
|
| - int32_t value = *addr;
|
| -
|
| - while (true) {
|
| - if (value == 0) {
|
| - return 0;
|
| - }
|
| -
|
| - int32_t before = __sync_val_compare_and_swap(addr, value, value + 1);
|
| -
|
| - if (before == value) {
|
| - return value;
|
| - } else {
|
| - value = before;
|
| - }
|
| - }
|
| -}
|
| -void sk_membar_aquire__after_atomic_conditional_inc() { }
|
| -
|
| -#else
|
| -
|
| -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_add(int32_t* addr, int32_t inc)
|
| -{
|
| - SkAutoMutexAcquire ac(gAtomicMutex);
|
| -
|
| - int32_t value = *addr;
|
| - *addr = value + inc;
|
| - return value;
|
| -}
|
| -
|
| -int32_t sk_atomic_dec(int32_t* addr)
|
| -{
|
| - SkAutoMutexAcquire ac(gAtomicMutex);
|
| -
|
| - int32_t value = *addr;
|
| - *addr = value - 1;
|
| - return value;
|
| -}
|
| -void sk_membar_aquire__after_atomic_dec() { }
|
| -
|
| -int32_t sk_atomic_conditional_inc(int32_t* addr)
|
| -{
|
| - SkAutoMutexAcquire ac(gAtomicMutex);
|
| -
|
| - int32_t value = *addr;
|
| - if (value != 0) ++*addr;
|
| - return value;
|
| -}
|
| -void sk_membar_aquire__after_atomic_conditional_inc() { }
|
| -
|
| -#endif
|
| -
|
| -#endif // SK_BUILD_FOR_ANDROID
|
| -
|
| -//////////////////////////////////////////////////////////////////////////////
|
| -
|
| -static void print_pthread_error(int status) {
|
| - switch (status) {
|
| - case 0: // success
|
| - break;
|
| - case EINVAL:
|
| - SkDebugf("pthread error [%d] EINVAL\n", status);
|
| - break;
|
| - case EBUSY:
|
| - SkDebugf("pthread error [%d] EBUSY\n", status);
|
| - break;
|
| - default:
|
| - SkDebugf("pthread error [%d] unknown\n", status);
|
| - break;
|
| - }
|
| -}
|
| -
|
| -#ifdef SK_USE_POSIX_THREADS
|
| -
|
| -SkMutex::SkMutex() {
|
| - int status;
|
| -
|
| - status = pthread_mutex_init(&fMutex, NULL);
|
| - if (status != 0) {
|
| - print_pthread_error(status);
|
| - SkASSERT(0 == status);
|
| - }
|
| -}
|
| -
|
| -SkMutex::~SkMutex() {
|
| - int status = pthread_mutex_destroy(&fMutex);
|
| -
|
| - // only report errors on non-global mutexes
|
| - if (status != 0) {
|
| - print_pthread_error(status);
|
| - SkASSERT(0 == status);
|
| - }
|
| -}
|
| -
|
| -#else // !SK_USE_POSIX_THREADS
|
| -
|
| -SkMutex::SkMutex() {
|
| - if (sizeof(pthread_mutex_t) > sizeof(fStorage)) {
|
| - SkDEBUGF(("pthread mutex size = %d\n", sizeof(pthread_mutex_t)));
|
| - SkDEBUGFAIL("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);
|
| -#if 0
|
| - // only report errors on non-global mutexes
|
| - if (!fIsGlobal) {
|
| - print_pthread_error(status);
|
| - SkASSERT(0 == status);
|
| - }
|
| -#endif
|
| -}
|
| -
|
| -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);
|
| -}
|
| -
|
| -#endif // !SK_USE_POSIX_THREADS
|
|
|