blob: 61bad701825aaa26279d22b4c9f75c7acabfb6a5 [file] [log] [blame]
/*
* 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<SkPoolDiscardableMemory> 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