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