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