blob: facdf3d27c98d0ace32442157b9a99fa28773fba [file] [log] [blame]
halcanary@google.com2c7c7ee2013-12-05 18:31:42 +00001/*
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"
mtklein7b274c72015-02-03 13:38:58 -080012#include "SkMutex.h"
halcanary@google.com2c7c7ee2013-12-05 18:31:42 +000013
commit-bot@chromium.orgcf2f0082014-04-04 16:43:38 +000014#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
halcanary@google.com2c7c7ee2013-12-05 18:31:42 +000020#endif
21
22/**
commit-bot@chromium.orgcf2f0082014-04-04 16:43:38 +000023 * 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.
halcanary@google.com2c7c7ee2013-12-05 18:31:42 +000027 */
halcanary@google.com2c7c7ee2013-12-05 18:31:42 +000028class SkDiscardableMemoryPool : public SkDiscardableMemory::Factory {
29public:
commit-bot@chromium.orgcf2f0082014-04-04 16:43:38 +000030 virtual ~SkDiscardableMemoryPool() { }
reed@google.com772443a2013-12-11 15:30:24 +000031
commit-bot@chromium.orgcf2f0082014-04-04 16:43:38 +000032 virtual size_t getRAMUsed() = 0;
33 virtual void setRAMBudget(size_t budget) = 0;
34 virtual size_t getRAMBudget() = 0;
reed@google.com772443a2013-12-11 15:30:24 +000035
halcanary@google.com2c7c7ee2013-12-05 18:31:42 +000036 /** purges all unlocked DMs */
commit-bot@chromium.orgcf2f0082014-04-04 16:43:38 +000037 virtual void dumpPool() = 0;
reed@google.com772443a2013-12-11 15:30:24 +000038
commit-bot@chromium.orgcf2f0082014-04-04 16:43:38 +000039 #if SK_LAZY_CACHE_STATS
40 /**
41 * These two values are a count of the number of successful and
42 * failed calls to SkDiscardableMemory::lock() for all DMs managed
43 * by this pool.
44 */
45 virtual int getCacheHits() = 0;
46 virtual int getCacheMisses() = 0;
47 virtual void resetCacheHitsAndMisses() = 0;
48 #endif
halcanary@google.com2c7c7ee2013-12-05 18:31:42 +000049
commit-bot@chromium.orgcf2f0082014-04-04 16:43:38 +000050 /**
51 * This non-global pool can be used for unit tests to verify that
52 * the pool works.
commit-bot@chromium.orgcf2f0082014-04-04 16:43:38 +000053 */
Hal Canary788c3c42017-04-25 08:58:57 -040054 static sk_sp<SkDiscardableMemoryPool> Make(size_t size);
halcanary@google.com2c7c7ee2013-12-05 18:31:42 +000055};
56
57/**
58 * Returns (and creates if needed) a threadsafe global
59 * SkDiscardableMemoryPool.
60 */
61SkDiscardableMemoryPool* SkGetGlobalDiscardableMemoryPool();
62
63#if !defined(SK_DEFAULT_GLOBAL_DISCARDABLE_MEMORY_POOL_SIZE)
halcanaryf91b47f2014-08-01 11:54:48 -070064#define SK_DEFAULT_GLOBAL_DISCARDABLE_MEMORY_POOL_SIZE (128 * 1024 * 1024)
halcanary@google.com2c7c7ee2013-12-05 18:31:42 +000065#endif
66
67#endif // SkDiscardableMemoryPool_DEFINED