diff -r 000000000000 -r 6474c204b198 gfx/skia/trunk/src/lazy/SkDiscardableMemoryPool.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/skia/trunk/src/lazy/SkDiscardableMemoryPool.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,78 @@ +/* + * 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