diff options
author | 2015-08-13 14:02:06 -0700 | |
---|---|---|
committer | 2015-08-13 14:02:06 -0700 | |
commit | 7e6d9c032662d876e83eb8e7bffada7ae0409eed (patch) | |
tree | aae331da15197b3bc86ba428f964f2702291906a /src/core | |
parent | c7993d747fff40328b6666845761efbbbfe720b7 (diff) |
Every pixel ref gets its own mutex.
Seems like a memory-saving flourish follow up would be to use SkSpinlock.
BUG=Florin's email.
Review URL: https://codereview.chromium.org/1289623004
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/SkPixelRef.cpp | 81 |
1 files changed, 4 insertions, 77 deletions
diff --git a/src/core/SkPixelRef.cpp b/src/core/SkPixelRef.cpp index bb21372f15..47f958dc38 100644 --- a/src/core/SkPixelRef.cpp +++ b/src/core/SkPixelRef.cpp @@ -13,52 +13,6 @@ //#define SK_SUPPORT_LEGACY_UNBALANCED_PIXELREF_LOCKCOUNT //#define SK_TRACE_PIXELREF_LIFETIME -#ifdef SK_BUILD_FOR_WIN32 - // We don't have SK_BASE_MUTEX_INIT on Windows. - - // must be a power-of-2. undef to just use 1 mutex - #define PIXELREF_MUTEX_RING_COUNT 32 - static SkBaseMutex gPixelRefMutexRing[PIXELREF_MUTEX_RING_COUNT]; - -#else - static SkBaseMutex gPixelRefMutexRing[] = { - SK_BASE_MUTEX_INIT, SK_BASE_MUTEX_INIT, - SK_BASE_MUTEX_INIT, SK_BASE_MUTEX_INIT, - SK_BASE_MUTEX_INIT, SK_BASE_MUTEX_INIT, - SK_BASE_MUTEX_INIT, SK_BASE_MUTEX_INIT, - - SK_BASE_MUTEX_INIT, SK_BASE_MUTEX_INIT, - SK_BASE_MUTEX_INIT, SK_BASE_MUTEX_INIT, - SK_BASE_MUTEX_INIT, SK_BASE_MUTEX_INIT, - SK_BASE_MUTEX_INIT, SK_BASE_MUTEX_INIT, - - SK_BASE_MUTEX_INIT, SK_BASE_MUTEX_INIT, - SK_BASE_MUTEX_INIT, SK_BASE_MUTEX_INIT, - SK_BASE_MUTEX_INIT, SK_BASE_MUTEX_INIT, - SK_BASE_MUTEX_INIT, SK_BASE_MUTEX_INIT, - - SK_BASE_MUTEX_INIT, SK_BASE_MUTEX_INIT, - SK_BASE_MUTEX_INIT, SK_BASE_MUTEX_INIT, - SK_BASE_MUTEX_INIT, SK_BASE_MUTEX_INIT, - SK_BASE_MUTEX_INIT, SK_BASE_MUTEX_INIT, - }; - // must be a power-of-2. undef to just use 1 mutex - #define PIXELREF_MUTEX_RING_COUNT SK_ARRAY_COUNT(gPixelRefMutexRing) - -#endif - -static SkBaseMutex* get_default_mutex() { - static int32_t gPixelRefMutexRingIndex; - - SkASSERT(SkIsPow2(PIXELREF_MUTEX_RING_COUNT)); - - // atomic_inc might be overkill here. It may be fine if once in a while - // we hit a race-condition and two subsequent calls get the same index... - int index = sk_atomic_inc(&gPixelRefMutexRingIndex); - return &gPixelRefMutexRing[index & (PIXELREF_MUTEX_RING_COUNT - 1)]; -} - -/////////////////////////////////////////////////////////////////////////////// #include "SkNextID.h" uint32_t SkNextID::ImageID() { @@ -73,13 +27,6 @@ uint32_t SkNextID::ImageID() { /////////////////////////////////////////////////////////////////////////////// -void SkPixelRef::setMutex(SkBaseMutex* mutex) { - if (NULL == mutex) { - mutex = get_default_mutex(); - } - fMutex = mutex; -} - // just need a > 0 value, so pick a funny one to aid in debugging #define SKPIXELREF_PRELOCKED_LOCKCOUNT 123456789 @@ -103,26 +50,6 @@ SkPixelRef::SkPixelRef(const SkImageInfo& info) #ifdef SK_TRACE_PIXELREF_LIFETIME SkDebugf(" pixelref %d\n", sk_atomic_inc(&gInstCounter)); #endif - this->setMutex(NULL); - fRec.zero(); - fLockCount = 0; - this->needsNewGenID(); - fMutability = kMutable; - fPreLocked = false; - fAddedToCache.store(false); -} - - -SkPixelRef::SkPixelRef(const SkImageInfo& info, SkBaseMutex* mutex) - : fInfo(validate_info(info)) -#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK - , fStableID(SkNextID::ImageID()) -#endif -{ -#ifdef SK_TRACE_PIXELREF_LIFETIME - SkDebugf(" pixelref %d\n", sk_atomic_inc(&gInstCounter)); -#endif - this->setMutex(mutex); fRec.zero(); fLockCount = 0; this->needsNewGenID(); @@ -186,7 +113,7 @@ void SkPixelRef::setPreLocked(void* pixels, size_t rowBytes, SkColorTable* ctabl // Increments fLockCount only on success bool SkPixelRef::lockPixelsInsideMutex() { - fMutex->assertHeld(); + fMutex.assertHeld(); if (1 == ++fLockCount) { SkASSERT(fRec.isZero()); @@ -212,7 +139,7 @@ bool SkPixelRef::lockPixels() { if (!fPreLocked) { TRACE_EVENT_BEGIN0("skia", "SkPixelRef::lockPixelsMutex"); - SkAutoMutexAcquire ac(*fMutex); + SkAutoMutexAcquire ac(fMutex); TRACE_EVENT_END0("skia", "SkPixelRef::lockPixelsMutex"); SkDEBUGCODE(int oldCount = fLockCount;) bool success = this->lockPixelsInsideMutex(); @@ -245,7 +172,7 @@ void SkPixelRef::unlockPixels() { SkASSERT(!fPreLocked || SKPIXELREF_PRELOCKED_LOCKCOUNT == fLockCount); if (!fPreLocked) { - SkAutoMutexAcquire ac(*fMutex); + SkAutoMutexAcquire ac(fMutex); SkASSERT(fLockCount > 0); if (0 == --fLockCount) { @@ -278,7 +205,7 @@ bool SkPixelRef::requestLock(const LockRequest& request, LockResult* result) { result->fRowBytes = fRec.fRowBytes; result->fSize.set(fInfo.width(), fInfo.height()); } else { - SkAutoMutexAcquire ac(*fMutex); + SkAutoMutexAcquire ac(fMutex); if (!this->onRequestLock(request, result)) { return false; } |