SkDiscardableMemoryPool.h revision 772443a3e6428422f20ca4f40ed453a5c3604884
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 "SkDiscardableMemory.h"
12#include "SkTInternalLList.h"
13#include "SkThread.h"
14
15class SkPoolDiscardableMemory;
16
17#ifdef SK_DEBUG
18    #define LAZY_CACHE_STATS 1
19#elif !defined(LAZY_CACHE_STATS)
20    #define LAZY_CACHE_STATS 0
21#endif
22
23/**
24 *  This non-global pool can be used for unit tests to verify that the
25 *  pool works.
26 */
27class SkDiscardableMemoryPool : public SkDiscardableMemory::Factory {
28public:
29    /**
30     *  Without mutex, will be not be thread safe.
31     */
32    SkDiscardableMemoryPool(size_t budget, SkBaseMutex* mutex = NULL);
33    virtual ~SkDiscardableMemoryPool();
34
35    virtual SkDiscardableMemory* create(size_t bytes) SK_OVERRIDE;
36
37    size_t getRAMUsed();
38    void setRAMBudget(size_t budget);
39
40    /** purges all unlocked DMs */
41    void dumpPool();
42
43    #if LAZY_CACHE_STATS
44    int          fCacheHits;
45    int          fCacheMisses;
46    #endif  // LAZY_CACHE_STATS
47
48private:
49    SkBaseMutex* fMutex;
50    size_t       fBudget;
51    size_t       fUsed;
52    SkTInternalLList<SkPoolDiscardableMemory> fList;
53
54    /** Function called to free memory if needed */
55    void dumpDownTo(size_t budget);
56    /** called by SkDiscardableMemoryPool upon destruction */
57    void free(SkPoolDiscardableMemory* dm);
58    /** called by SkDiscardableMemoryPool::lock() */
59    bool lock(SkPoolDiscardableMemory* dm);
60    /** called by SkDiscardableMemoryPool::unlock() */
61    void unlock(SkPoolDiscardableMemory* dm);
62
63    friend class SkPoolDiscardableMemory;
64
65    typedef SkDiscardableMemory::Factory INHERITED;
66};
67
68/**
69 *  Returns (and creates if needed) a threadsafe global
70 *  SkDiscardableMemoryPool.
71 */
72SkDiscardableMemoryPool* SkGetGlobalDiscardableMemoryPool();
73
74#if !defined(SK_DEFAULT_GLOBAL_DISCARDABLE_MEMORY_POOL_SIZE)
75#define SK_DEFAULT_GLOBAL_DISCARDABLE_MEMORY_POOL_SIZE (128 * 1024 * 1024)
76#endif
77
78#endif  // SkDiscardableMemoryPool_DEFINED
79