blob: 05d28150b0b3f9ffa83cf296b0da066e3e8f21fe [file] [log] [blame]
scroggo@google.comf8d7d272013-02-22 21:38:35 +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 SkLruImageCache_DEFINED
9#define SkLruImageCache_DEFINED
10
11#include "SkImageCache.h"
12#include "SkThread.h"
13#include "SkTInternalLList.h"
14
15class CachedPixels;
16
17/**
18 * SkImageCache implementation that uses an LRU cache to age out old images.
19 */
20class SkLruImageCache : public SkImageCache {
21
22public:
23 SkLruImageCache(size_t budget);
24
25 virtual ~SkLruImageCache();
26
27#ifdef SK_DEBUG
28 CacheStatus getCacheStatus(intptr_t ID) const SK_OVERRIDE;
29#endif
30
scroggo@google.coma560d00b2013-03-04 21:32:32 +000031 /**
32 * Set the byte limit on cached pixels. If more bytes are used than this, the cache will free
33 * unpinned memory until under the new limit or until all unpinned memory is freed. This will
34 * never free pinned memory, so the cache can potentially remain over the limit. The limit is
35 * enforced each time memory is allocated or released.
36 * 0 is a special flag for an infinite budget.
37 * @return size_t The previous limit.
38 */
39 size_t setImageCacheLimit(size_t newLimit);
40
41 /**
42 * Return the number of bytes of memory currently in use by the cache. Can include memory that
43 * is no longer pinned, but has not been freed.
44 */
45 size_t getImageCacheUsed() const { return fRamUsed; }
scroggo@google.comf8d7d272013-02-22 21:38:35 +000046
47 virtual void* allocAndPinCache(size_t bytes, intptr_t* ID) SK_OVERRIDE;
48 virtual void* pinCache(intptr_t ID) SK_OVERRIDE;
49 virtual void releaseCache(intptr_t ID) SK_OVERRIDE;
50 virtual void throwAwayCache(intptr_t ID) SK_OVERRIDE;
51
52private:
53 // Linked list of recently used. Head is the most recently used, and tail is the least.
54 SkTInternalLList<CachedPixels> fLRU;
55 typedef SkTInternalLList<CachedPixels>::Iter Iter;
56
57#ifdef SK_DEBUG
58 // fMutex is mutable so that getCacheStatus can be const
59 mutable
60#endif
61 SkMutex fMutex;
62 size_t fRamBudget;
63 size_t fRamUsed;
64
65 /**
66 * Find the CachedPixels represented by ID, or NULL if not in the cache. Mutex must be locked
67 * before calling.
68 */
69 CachedPixels* findByID(intptr_t ID) const;
70
71 /**
72 * If over budget, throw away pixels which are not currently in use until below budget or there
73 * are no more pixels eligible to be thrown away. Mutex must be locked before calling.
74 */
75 void purgeIfNeeded();
76
77 /**
78 * Purge until below limit. Mutex must be locked before calling.
79 */
80 void purgeTilAtOrBelow(size_t limit);
81
82 /**
83 * Remove a set of CachedPixels. Mutex must be locked before calling.
84 */
85 void removePixels(CachedPixels*);
86};
87
88#endif // SkLruImageCache_DEFINED