/* * Copyright 2013 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkDiscardableMemoryPool_DEFINED #define SkDiscardableMemoryPool_DEFINED #include "SkDiscardableMemory.h" #include "SkTInternalLList.h" #include "SkThread.h" class SkPoolDiscardableMemory; #ifdef SK_DEBUG #define LAZY_CACHE_STATS 1 #elif !defined(LAZY_CACHE_STATS) #define LAZY_CACHE_STATS 0 #endif /** * This non-global pool can be used for unit tests to verify that the * pool works. */ class SkDiscardableMemoryPool : public SkDiscardableMemory::Factory { public: /** * Without mutex, will be not be thread safe. */ SkDiscardableMemoryPool(size_t budget, SkBaseMutex* mutex = NULL); virtual ~SkDiscardableMemoryPool(); virtual SkDiscardableMemory* create(size_t bytes) SK_OVERRIDE; size_t getRAMUsed(); void setRAMBudget(size_t budget); /** purges all unlocked DMs */ void dumpPool(); #if LAZY_CACHE_STATS int fCacheHits; int fCacheMisses; #endif // LAZY_CACHE_STATS private: SkBaseMutex* fMutex; size_t fBudget; size_t fUsed; SkTInternalLList fList; /** Function called to free memory if needed */ void dumpDownTo(size_t budget); /** called by SkDiscardableMemoryPool upon destruction */ void free(SkPoolDiscardableMemory* dm); /** called by SkDiscardableMemoryPool::lock() */ bool lock(SkPoolDiscardableMemory* dm); /** called by SkDiscardableMemoryPool::unlock() */ void unlock(SkPoolDiscardableMemory* dm); friend class SkPoolDiscardableMemory; typedef SkDiscardableMemory::Factory INHERITED; }; /** * Returns (and creates if needed) a threadsafe global * SkDiscardableMemoryPool. */ SkDiscardableMemoryPool* SkGetGlobalDiscardableMemoryPool(); #if !defined(SK_DEFAULT_GLOBAL_DISCARDABLE_MEMORY_POOL_SIZE) #define SK_DEFAULT_GLOBAL_DISCARDABLE_MEMORY_POOL_SIZE (128 * 1024 * 1024) #endif #endif // SkDiscardableMemoryPool_DEFINED