1 /* 2 * Copyright 2013 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkDiscardableMemoryPool_DEFINED 9 #define SkDiscardableMemoryPool_DEFINED 10 11 #include "SkDiscardableMemory.h" 12 #include "SkMutex.h" 13 14 #ifndef SK_LAZY_CACHE_STATS 15 #ifdef SK_DEBUG 16 #define SK_LAZY_CACHE_STATS 1 17 #else 18 #define SK_LAZY_CACHE_STATS 0 19 #endif 20 #endif 21 22 /** 23 * An implementation of Discardable Memory that manages a fixed-size 24 * budget of memory. When the allocated memory exceeds this size, 25 * unlocked blocks of memory are purged. If all memory is locked, it 26 * can exceed the memory-use budget. 27 */ 28 class SkDiscardableMemoryPool : public SkDiscardableMemory::Factory { 29 public: ~SkDiscardableMemoryPool()30 virtual ~SkDiscardableMemoryPool() { } 31 32 virtual size_t getRAMUsed() = 0; 33 virtual void setRAMBudget(size_t budget) = 0; 34 virtual size_t getRAMBudget() = 0; 35 36 /** purges all unlocked DMs */ 37 virtual void dumpPool() = 0; 38 39 #if SK_LAZY_CACHE_STATS 40 /** 41 * These two values are a count of the number of successful and 42 * failed calls to SkDiscardableMemory::lock() for all DMs managed 43 * by this pool. 44 */ 45 virtual int getCacheHits() = 0; 46 virtual int getCacheMisses() = 0; 47 virtual void resetCacheHitsAndMisses() = 0; 48 #endif 49 50 /** 51 * This non-global pool can be used for unit tests to verify that 52 * the pool works. 53 * Without mutex, will be not be thread safe. 54 */ 55 static SkDiscardableMemoryPool* Create( 56 size_t size, SkBaseMutex* mutex = NULL); 57 }; 58 59 /** 60 * Returns (and creates if needed) a threadsafe global 61 * SkDiscardableMemoryPool. 62 */ 63 SkDiscardableMemoryPool* SkGetGlobalDiscardableMemoryPool(); 64 65 #if !defined(SK_DEFAULT_GLOBAL_DISCARDABLE_MEMORY_POOL_SIZE) 66 #define SK_DEFAULT_GLOBAL_DISCARDABLE_MEMORY_POOL_SIZE (128 * 1024 * 1024) 67 #endif 68 69 #endif // SkDiscardableMemoryPool_DEFINED 70