| OLD | NEW |
| (Empty) |
| 1 | |
| 2 /* | |
| 3 * Copyright 2011 Google Inc. | |
| 4 * | |
| 5 * Use of this source code is governed by a BSD-style license that can be | |
| 6 * found in the LICENSE file. | |
| 7 */ | |
| 8 #include "SkImageRef_GlobalPool.h" | |
| 9 #include "SkImageRefPool.h" | |
| 10 #include "SkThread.h" | |
| 11 | |
| 12 SK_DECLARE_STATIC_MUTEX(gGlobalPoolMutex); | |
| 13 | |
| 14 /* | |
| 15 * This returns the lazily-allocated global pool. It must be called | |
| 16 * from inside the guard mutex, so we safely only ever allocate 1. | |
| 17 */ | |
| 18 static SkImageRefPool* GetGlobalPool() { | |
| 19 static SkImageRefPool* gPool; | |
| 20 if (NULL == gPool) { | |
| 21 gPool = SkNEW(SkImageRefPool); | |
| 22 // call sk_atexit(...) when we have that, to free the global pool | |
| 23 } | |
| 24 return gPool; | |
| 25 } | |
| 26 | |
| 27 SkImageRef_GlobalPool::SkImageRef_GlobalPool(const SkImageInfo& info, | |
| 28 SkStreamRewindable* stream, | |
| 29 int sampleSize) | |
| 30 : SkImageRef(info, stream, sampleSize, &gGlobalPoolMutex) { | |
| 31 SkASSERT(&gGlobalPoolMutex == this->mutex()); | |
| 32 SkAutoMutexAcquire ac(gGlobalPoolMutex); | |
| 33 GetGlobalPool()->addToHead(this); | |
| 34 } | |
| 35 | |
| 36 SkImageRef_GlobalPool::~SkImageRef_GlobalPool() { | |
| 37 SkASSERT(&gGlobalPoolMutex == this->mutex()); | |
| 38 SkAutoMutexAcquire ac(gGlobalPoolMutex); | |
| 39 GetGlobalPool()->detach(this); | |
| 40 } | |
| 41 | |
| 42 /* By design, onUnlockPixels() already is inside the mutex-lock, | |
| 43 * and it is the (indirect) caller of onDecode(), therefore we can assume | |
| 44 * that we also are already inside the mutex. Hence, we can reference | |
| 45 * the global-pool directly. | |
| 46 */ | |
| 47 bool SkImageRef_GlobalPool::onDecode(SkImageDecoder* codec, SkStreamRewindable*
stream, | |
| 48 SkBitmap* bitmap, SkBitmap::Config config, | |
| 49 SkImageDecoder::Mode mode) { | |
| 50 if (!this->INHERITED::onDecode(codec, stream, bitmap, config, mode)) { | |
| 51 return false; | |
| 52 } | |
| 53 if (mode == SkImageDecoder::kDecodePixels_Mode) { | |
| 54 // no need to grab the mutex here, it has already been acquired. | |
| 55 GetGlobalPool()->justAddedPixels(this); | |
| 56 } | |
| 57 return true; | |
| 58 } | |
| 59 | |
| 60 void SkImageRef_GlobalPool::onUnlockPixels() { | |
| 61 this->INHERITED::onUnlockPixels(); | |
| 62 | |
| 63 // by design, onUnlockPixels() already is inside the mutex-lock | |
| 64 GetGlobalPool()->canLosePixels(this); | |
| 65 } | |
| 66 | |
| 67 SkImageRef_GlobalPool::SkImageRef_GlobalPool(SkFlattenableReadBuffer& buffer) | |
| 68 : INHERITED(buffer, &gGlobalPoolMutex) { | |
| 69 SkASSERT(&gGlobalPoolMutex == this->mutex()); | |
| 70 SkAutoMutexAcquire ac(gGlobalPoolMutex); | |
| 71 GetGlobalPool()->addToHead(this); | |
| 72 } | |
| 73 | |
| 74 /////////////////////////////////////////////////////////////////////////////// | |
| 75 // global imagerefpool wrappers | |
| 76 | |
| 77 size_t SkImageRef_GlobalPool::GetRAMBudget() { | |
| 78 SkAutoMutexAcquire ac(gGlobalPoolMutex); | |
| 79 return GetGlobalPool()->getRAMBudget(); | |
| 80 } | |
| 81 | |
| 82 void SkImageRef_GlobalPool::SetRAMBudget(size_t size) { | |
| 83 SkAutoMutexAcquire ac(gGlobalPoolMutex); | |
| 84 GetGlobalPool()->setRAMBudget(size); | |
| 85 } | |
| 86 | |
| 87 size_t SkImageRef_GlobalPool::GetRAMUsed() { | |
| 88 SkAutoMutexAcquire ac(gGlobalPoolMutex); | |
| 89 return GetGlobalPool()->getRAMUsed(); | |
| 90 } | |
| 91 | |
| 92 void SkImageRef_GlobalPool::SetRAMUsed(size_t usage) { | |
| 93 SkAutoMutexAcquire ac(gGlobalPoolMutex); | |
| 94 GetGlobalPool()->setRAMUsed(usage); | |
| 95 } | |
| 96 | |
| 97 void SkImageRef_GlobalPool::DumpPool() { | |
| 98 SkAutoMutexAcquire ac(gGlobalPoolMutex); | |
| 99 GetGlobalPool()->dump(); | |
| 100 } | |
| OLD | NEW |