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