/work/obj-fuzz/dist/include/nsExpirationTracker.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 | | /* vim: set ts=8 sts=2 et sw=2 tw=80: */ |
3 | | /* This Source Code Form is subject to the terms of the Mozilla Public |
4 | | * License, v. 2.0. If a copy of the MPL was not distributed with this |
5 | | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
6 | | |
7 | | #ifndef NSEXPIRATIONTRACKER_H_ |
8 | | #define NSEXPIRATIONTRACKER_H_ |
9 | | |
10 | | #include "mozilla/Logging.h" |
11 | | #include "nsTArray.h" |
12 | | #include "nsITimer.h" |
13 | | #include "nsCOMPtr.h" |
14 | | #include "nsAutoPtr.h" |
15 | | #include "nsComponentManagerUtils.h" |
16 | | #include "nsIEventTarget.h" |
17 | | #include "nsIObserver.h" |
18 | | #include "nsIObserverService.h" |
19 | | #include "nsThreadUtils.h" |
20 | | #include "mozilla/Attributes.h" |
21 | | #include "mozilla/Services.h" |
22 | | |
23 | | /** |
24 | | * Data used to track the expiration state of an object. We promise that this |
25 | | * is 32 bits so that objects that includes this as a field can pad and align |
26 | | * efficiently. |
27 | | */ |
28 | | struct nsExpirationState |
29 | | { |
30 | | enum |
31 | | { |
32 | | NOT_TRACKED = (1U << 4) - 1, |
33 | | MAX_INDEX_IN_GENERATION = (1U << 28) - 1 |
34 | | }; |
35 | | |
36 | | nsExpirationState() |
37 | | : mGeneration(NOT_TRACKED) |
38 | | , mIndexInGeneration(0) |
39 | 0 | { |
40 | 0 | } |
41 | 0 | bool IsTracked() { return mGeneration != NOT_TRACKED; } |
42 | | |
43 | | /** |
44 | | * The generation that this object belongs to, or NOT_TRACKED. |
45 | | */ |
46 | | uint32_t mGeneration:4; |
47 | | uint32_t mIndexInGeneration:28; |
48 | | }; |
49 | | |
50 | | /** |
51 | | * ExpirationTracker classes: |
52 | | * - ExpirationTrackerImpl (Thread-safe class) |
53 | | * - nsExpirationTracker (Main-thread only class) |
54 | | * |
55 | | * These classes can track the lifetimes and usage of a large number of |
56 | | * objects, and send a notification some window of time after a live object was |
57 | | * last used. This is very useful when you manage a large number of objects |
58 | | * and want to flush some after they haven't been used for a while. |
59 | | * nsExpirationTracker is designed to be very space and time efficient. |
60 | | * |
61 | | * The type parameter T is the object type that we will track pointers to. T |
62 | | * must include an accessible method GetExpirationState() that returns a |
63 | | * pointer to an nsExpirationState associated with the object (preferably, |
64 | | * stored in a field of the object). |
65 | | * |
66 | | * The parameter K is the number of generations that will be used. Increasing |
67 | | * the number of generations narrows the window within which we promise |
68 | | * to fire notifications, at a slight increase in space cost for the tracker. |
69 | | * We require 2 <= K <= nsExpirationState::NOT_TRACKED (currently 15). |
70 | | * |
71 | | * To use this class, you need to inherit from it and override the |
72 | | * NotifyExpired() method. |
73 | | * |
74 | | * The approach is to track objects in K generations. When an object is accessed |
75 | | * it moves from its current generation to the newest generation. Generations |
76 | | * are stored in a cyclic array; when a timer interrupt fires, we advance |
77 | | * the current generation pointer to effectively age all objects very efficiently. |
78 | | * By storing information in each object about its generation and index within its |
79 | | * generation array, we make removal of objects from a generation very cheap. |
80 | | * |
81 | | * Future work: |
82 | | * -- Add a method to change the timer period? |
83 | | */ |
84 | | |
85 | | /** |
86 | | * Base class for ExiprationTracker implementations. |
87 | | * |
88 | | * nsExpirationTracker class below is a specialized class to be inherited by the |
89 | | * instances to be accessed only on main-thread. |
90 | | * |
91 | | * For creating a thread-safe tracker, you can define a subclass inheriting this |
92 | | * base class and specialize the Mutex and AutoLock to be used. |
93 | | * |
94 | | */ |
95 | | template<typename T, uint32_t K, typename Mutex, typename AutoLock> |
96 | | class ExpirationTrackerImpl |
97 | | { |
98 | | public: |
99 | | /** |
100 | | * Initialize the tracker. |
101 | | * @param aTimerPeriod the timer period in milliseconds. The guarantees |
102 | | * provided by the tracker are defined in terms of this period. If the |
103 | | * period is zero, then we don't use a timer and rely on someone calling |
104 | | * AgeOneGenerationLocked explicitly. |
105 | | * @param aName the name of the subclass for telemetry. |
106 | | * @param aEventTarget the optional event target on main thread to label the |
107 | | * runnable of the asynchronous invocation to NotifyExpired(). |
108 | | |
109 | | */ |
110 | | ExpirationTrackerImpl(uint32_t aTimerPeriod, |
111 | | const char* aName, |
112 | | nsIEventTarget* aEventTarget = nullptr) |
113 | | : mTimerPeriod(aTimerPeriod) |
114 | | , mNewestGeneration(0) |
115 | | , mInAgeOneGeneration(false) |
116 | | , mName(aName) |
117 | | , mEventTarget(aEventTarget) |
118 | 0 | { |
119 | 0 | static_assert(K >= 2 && K <= nsExpirationState::NOT_TRACKED, |
120 | 0 | "Unsupported number of generations (must be 2 <= K <= 15)"); |
121 | 0 | MOZ_ASSERT(NS_IsMainThread()); |
122 | 0 | if (mEventTarget) { |
123 | 0 | bool current = false; |
124 | 0 | // NOTE: The following check+crash could be condensed into a |
125 | 0 | // MOZ_RELEASE_ASSERT, but that triggers a segfault during compilation in |
126 | 0 | // clang 3.8. Once we don't have to care about clang 3.8 anymore, though, |
127 | 0 | // we can convert to MOZ_RELEASE_ASSERT here. |
128 | 0 | if (MOZ_UNLIKELY(NS_FAILED(mEventTarget->IsOnCurrentThread(¤t)) || |
129 | 0 | !current)) { |
130 | 0 | MOZ_CRASH("Provided event target must be on the main thread"); |
131 | 0 | } |
132 | 0 | } |
133 | 0 | mObserver = new ExpirationTrackerObserver(); |
134 | 0 | mObserver->Init(this); |
135 | 0 | } Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::ActiveResource, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerImpl(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::TileClient, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerImpl(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: ExpirationTrackerImpl<BlurCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerImpl(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: ExpirationTrackerImpl<gfxFont, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerImpl(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::gfx::GradientCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerImpl(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::image::CachedSurface, 2u, mozilla::BaseStaticMutex<(mozilla::recordreplay::Behavior)1>, mozilla::BaseAutoLock<mozilla::AnyStaticMutex> >::ExpirationTrackerImpl(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: ExpirationTrackerImpl<imgCacheEntry, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerImpl(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: ExpirationTrackerImpl<nsIDocument::SelectorCacheKey, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerImpl(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ImageCacheEntryData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerImpl(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ScrollFrameHelper, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerImpl(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::LayerActivity, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerImpl(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: ExpirationTrackerImpl<nsSHEntryShared, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerImpl(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerImpl(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerImpl(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 8u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerImpl(unsigned int, char const*, nsIEventTarget*) |
136 | | |
137 | | virtual ~ExpirationTrackerImpl() |
138 | 0 | { |
139 | 0 | MOZ_ASSERT(NS_IsMainThread()); |
140 | 0 | if (mTimer) { |
141 | 0 | mTimer->Cancel(); |
142 | 0 | } |
143 | 0 | mObserver->Destroy(); |
144 | 0 | } Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::ActiveResource, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::~ExpirationTrackerImpl() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::TileClient, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::~ExpirationTrackerImpl() Unexecuted instantiation: ExpirationTrackerImpl<BlurCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::~ExpirationTrackerImpl() Unexecuted instantiation: ExpirationTrackerImpl<gfxFont, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::~ExpirationTrackerImpl() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::gfx::GradientCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::~ExpirationTrackerImpl() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::image::CachedSurface, 2u, mozilla::BaseStaticMutex<(mozilla::recordreplay::Behavior)1>, mozilla::BaseAutoLock<mozilla::AnyStaticMutex> >::~ExpirationTrackerImpl() Unexecuted instantiation: ExpirationTrackerImpl<imgCacheEntry, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::~ExpirationTrackerImpl() Unexecuted instantiation: ExpirationTrackerImpl<nsIDocument::SelectorCacheKey, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::~ExpirationTrackerImpl() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ImageCacheEntryData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::~ExpirationTrackerImpl() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ScrollFrameHelper, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::~ExpirationTrackerImpl() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::LayerActivity, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::~ExpirationTrackerImpl() Unexecuted instantiation: ExpirationTrackerImpl<nsSHEntryShared, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::~ExpirationTrackerImpl() Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::~ExpirationTrackerImpl() Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::~ExpirationTrackerImpl() Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 8u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::~ExpirationTrackerImpl() |
145 | | |
146 | | /** |
147 | | * Add an object to be tracked. It must not already be tracked. It will |
148 | | * be added to the newest generation, i.e., as if it was just used. |
149 | | * @return an error on out-of-memory |
150 | | */ |
151 | | nsresult AddObjectLocked(T* aObj, const AutoLock& aAutoLock) |
152 | 0 | { |
153 | 0 | if (NS_WARN_IF(!aObj)) { |
154 | 0 | MOZ_DIAGNOSTIC_ASSERT(false, "Invalid object to add"); |
155 | 0 | return NS_ERROR_UNEXPECTED; |
156 | 0 | } |
157 | 0 | nsExpirationState* state = aObj->GetExpirationState(); |
158 | 0 | if (NS_WARN_IF(state->IsTracked())) { |
159 | 0 | MOZ_DIAGNOSTIC_ASSERT(false, "Tried to add an object that's already tracked"); |
160 | 0 | return NS_ERROR_UNEXPECTED; |
161 | 0 | } |
162 | 0 | nsTArray<T*>& generation = mGenerations[mNewestGeneration]; |
163 | 0 | uint32_t index = generation.Length(); |
164 | 0 | if (index > nsExpirationState::MAX_INDEX_IN_GENERATION) { |
165 | 0 | NS_WARNING("More than 256M elements tracked, this is probably a problem"); |
166 | 0 | return NS_ERROR_OUT_OF_MEMORY; |
167 | 0 | } |
168 | 0 | if (index == 0) { |
169 | 0 | // We might need to start the timer |
170 | 0 | nsresult rv = CheckStartTimerLocked(aAutoLock); |
171 | 0 | if (NS_FAILED(rv)) { |
172 | 0 | return rv; |
173 | 0 | } |
174 | 0 | } |
175 | 0 | if (!generation.AppendElement(aObj)) { |
176 | 0 | return NS_ERROR_OUT_OF_MEMORY; |
177 | 0 | } |
178 | 0 | state->mGeneration = mNewestGeneration; |
179 | 0 | state->mIndexInGeneration = index; |
180 | 0 | return NS_OK; |
181 | 0 | } Unexecuted instantiation: ExpirationTrackerImpl<nsIDocument::SelectorCacheKey, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AddObjectLocked(nsIDocument::SelectorCacheKey*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<gfxFont, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AddObjectLocked(gfxFont*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::ActiveResource, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AddObjectLocked(mozilla::layers::ActiveResource*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::TileClient, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AddObjectLocked(mozilla::layers::TileClient*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<BlurCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AddObjectLocked(BlurCacheData*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::gfx::GradientCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AddObjectLocked(mozilla::gfx::GradientCacheData*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::image::CachedSurface, 2u, mozilla::BaseStaticMutex<(mozilla::recordreplay::Behavior)1>, mozilla::BaseAutoLock<mozilla::AnyStaticMutex> >::AddObjectLocked(mozilla::image::CachedSurface*, mozilla::BaseAutoLock<mozilla::AnyStaticMutex> const&) Unexecuted instantiation: ExpirationTrackerImpl<imgCacheEntry, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AddObjectLocked(imgCacheEntry*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ImageCacheEntryData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AddObjectLocked(mozilla::ImageCacheEntryData*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ScrollFrameHelper, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AddObjectLocked(mozilla::ScrollFrameHelper*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::LayerActivity, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AddObjectLocked(mozilla::LayerActivity*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<nsSHEntryShared, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AddObjectLocked(nsSHEntryShared*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AddObjectLocked(TestExpirationTracker::Object*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AddObjectLocked(TestExpirationTracker::Object*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 8u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AddObjectLocked(TestExpirationTracker::Object*, detail::PlaceholderAutoLock const&) |
182 | | |
183 | | /** |
184 | | * Remove an object from the tracker. It must currently be tracked. |
185 | | */ |
186 | | void RemoveObjectLocked(T* aObj, const AutoLock& aAutoLock) |
187 | 0 | { |
188 | 0 | if (NS_WARN_IF(!aObj)) { |
189 | 0 | MOZ_DIAGNOSTIC_ASSERT(false, "Invalid object to remove"); |
190 | 0 | return; |
191 | 0 | } |
192 | 0 | nsExpirationState* state = aObj->GetExpirationState(); |
193 | 0 | if (NS_WARN_IF(!state->IsTracked())) { |
194 | 0 | MOZ_DIAGNOSTIC_ASSERT(false, "Tried to remove an object that's not tracked"); |
195 | 0 | return; |
196 | 0 | } |
197 | 0 | nsTArray<T*>& generation = mGenerations[state->mGeneration]; |
198 | 0 | uint32_t index = state->mIndexInGeneration; |
199 | 0 | MOZ_ASSERT(generation.Length() > index && |
200 | 0 | generation[index] == aObj, "Object is lying about its index"); |
201 | 0 | // Move the last object to fill the hole created by removing aObj |
202 | 0 | uint32_t last = generation.Length() - 1; |
203 | 0 | T* lastObj = generation[last]; |
204 | 0 | generation[index] = lastObj; |
205 | 0 | lastObj->GetExpirationState()->mIndexInGeneration = index; |
206 | 0 | generation.RemoveElementAt(last); |
207 | 0 | MOZ_ASSERT(generation.Length() == last); |
208 | 0 | state->mGeneration = nsExpirationState::NOT_TRACKED; |
209 | 0 | // We do not check whether we need to stop the timer here. The timer |
210 | 0 | // will check that itself next time it fires. Checking here would not |
211 | 0 | // be efficient since we'd need to track all generations. Also we could |
212 | 0 | // thrash by incessantly creating and destroying timers if someone |
213 | 0 | // kept adding and removing an object from the tracker. |
214 | 0 | } Unexecuted instantiation: ExpirationTrackerImpl<gfxFont, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::RemoveObjectLocked(gfxFont*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::ActiveResource, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::RemoveObjectLocked(mozilla::layers::ActiveResource*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::TileClient, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::RemoveObjectLocked(mozilla::layers::TileClient*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<BlurCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::RemoveObjectLocked(BlurCacheData*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::gfx::GradientCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::RemoveObjectLocked(mozilla::gfx::GradientCacheData*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::image::CachedSurface, 2u, mozilla::BaseStaticMutex<(mozilla::recordreplay::Behavior)1>, mozilla::BaseAutoLock<mozilla::AnyStaticMutex> >::RemoveObjectLocked(mozilla::image::CachedSurface*, mozilla::BaseAutoLock<mozilla::AnyStaticMutex> const&) Unexecuted instantiation: ExpirationTrackerImpl<imgCacheEntry, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::RemoveObjectLocked(imgCacheEntry*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<nsIDocument::SelectorCacheKey, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::RemoveObjectLocked(nsIDocument::SelectorCacheKey*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ImageCacheEntryData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::RemoveObjectLocked(mozilla::ImageCacheEntryData*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ScrollFrameHelper, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::RemoveObjectLocked(mozilla::ScrollFrameHelper*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::LayerActivity, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::RemoveObjectLocked(mozilla::LayerActivity*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<nsSHEntryShared, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::RemoveObjectLocked(nsSHEntryShared*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::RemoveObjectLocked(TestExpirationTracker::Object*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::RemoveObjectLocked(TestExpirationTracker::Object*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 8u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::RemoveObjectLocked(TestExpirationTracker::Object*, detail::PlaceholderAutoLock const&) |
215 | | |
216 | | /** |
217 | | * Notify that an object has been used. |
218 | | * @return an error if we lost the object from the tracker... |
219 | | */ |
220 | | nsresult MarkUsedLocked(T* aObj, const AutoLock& aAutoLock) |
221 | 0 | { |
222 | 0 | nsExpirationState* state = aObj->GetExpirationState(); |
223 | 0 | if (mNewestGeneration == state->mGeneration) { |
224 | 0 | return NS_OK; |
225 | 0 | } |
226 | 0 | RemoveObjectLocked(aObj, aAutoLock); |
227 | 0 | return AddObjectLocked(aObj, aAutoLock); |
228 | 0 | } Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::ActiveResource, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::MarkUsedLocked(mozilla::layers::ActiveResource*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<BlurCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::MarkUsedLocked(BlurCacheData*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::gfx::GradientCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::MarkUsedLocked(mozilla::gfx::GradientCacheData*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::image::CachedSurface, 2u, mozilla::BaseStaticMutex<(mozilla::recordreplay::Behavior)1>, mozilla::BaseAutoLock<mozilla::AnyStaticMutex> >::MarkUsedLocked(mozilla::image::CachedSurface*, mozilla::BaseAutoLock<mozilla::AnyStaticMutex> const&) Unexecuted instantiation: ExpirationTrackerImpl<imgCacheEntry, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::MarkUsedLocked(imgCacheEntry*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ImageCacheEntryData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::MarkUsedLocked(mozilla::ImageCacheEntryData*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ScrollFrameHelper, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::MarkUsedLocked(mozilla::ScrollFrameHelper*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::LayerActivity, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::MarkUsedLocked(mozilla::LayerActivity*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::MarkUsedLocked(TestExpirationTracker::Object*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::MarkUsedLocked(TestExpirationTracker::Object*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 8u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::MarkUsedLocked(TestExpirationTracker::Object*, detail::PlaceholderAutoLock const&) |
229 | | |
230 | | /** |
231 | | * The timer calls this, but it can also be manually called if you want |
232 | | * to age objects "artifically". This can result in calls to NotifyExpiredLocked. |
233 | | */ |
234 | | void AgeOneGenerationLocked(const AutoLock& aAutoLock) |
235 | 0 | { |
236 | 0 | if (mInAgeOneGeneration) { |
237 | 0 | NS_WARNING("Can't reenter AgeOneGeneration from NotifyExpired"); |
238 | 0 | return; |
239 | 0 | } |
240 | 0 |
|
241 | 0 | mInAgeOneGeneration = true; |
242 | 0 | uint32_t reapGeneration = |
243 | 0 | mNewestGeneration > 0 ? mNewestGeneration - 1 : K - 1; |
244 | 0 | nsTArray<T*>& generation = mGenerations[reapGeneration]; |
245 | 0 | // The following is rather tricky. We have to cope with objects being |
246 | 0 | // removed from this generation either because of a call to RemoveObject |
247 | 0 | // (or indirectly via MarkUsedLocked) inside NotifyExpiredLocked. Fortunately |
248 | 0 | // no objects can be added to this generation because it's not the newest |
249 | 0 | // generation. We depend on the fact that RemoveObject can only cause |
250 | 0 | // the indexes of objects in this generation to *decrease*, not increase. |
251 | 0 | // So if we start from the end and work our way backwards we are guaranteed |
252 | 0 | // to see each object at least once. |
253 | 0 | size_t index = generation.Length(); |
254 | 0 | for (;;) { |
255 | 0 | // Objects could have been removed so index could be outside |
256 | 0 | // the array |
257 | 0 | index = XPCOM_MIN(index, generation.Length()); |
258 | 0 | if (index == 0) { |
259 | 0 | break; |
260 | 0 | } |
261 | 0 | --index; |
262 | 0 | NotifyExpiredLocked(generation[index], aAutoLock); |
263 | 0 | } |
264 | 0 | // Any leftover objects from reapGeneration just end up in the new |
265 | 0 | // newest-generation. This is bad form, though, so warn if there are any. |
266 | 0 | if (!generation.IsEmpty()) { |
267 | 0 | NS_WARNING("Expired objects were not removed or marked used"); |
268 | 0 | } |
269 | 0 | // Free excess memory used by the generation array, since we probably |
270 | 0 | // just removed most or all of its elements. |
271 | 0 | generation.Compact(); |
272 | 0 | mNewestGeneration = reapGeneration; |
273 | 0 | mInAgeOneGeneration = false; |
274 | 0 | } Unexecuted instantiation: ExpirationTrackerImpl<nsIDocument::SelectorCacheKey, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeOneGenerationLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<gfxFont, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeOneGenerationLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::ActiveResource, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeOneGenerationLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::TileClient, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeOneGenerationLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<BlurCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeOneGenerationLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::gfx::GradientCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeOneGenerationLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::image::CachedSurface, 2u, mozilla::BaseStaticMutex<(mozilla::recordreplay::Behavior)1>, mozilla::BaseAutoLock<mozilla::AnyStaticMutex> >::AgeOneGenerationLocked(mozilla::BaseAutoLock<mozilla::AnyStaticMutex> const&) Unexecuted instantiation: ExpirationTrackerImpl<imgCacheEntry, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeOneGenerationLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ImageCacheEntryData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeOneGenerationLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ScrollFrameHelper, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeOneGenerationLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::LayerActivity, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeOneGenerationLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<nsSHEntryShared, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeOneGenerationLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeOneGenerationLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeOneGenerationLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 8u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeOneGenerationLocked(detail::PlaceholderAutoLock const&) |
275 | | |
276 | | /** |
277 | | * This just calls AgeOneGenerationLocked K times. Under normal circumstances |
278 | | * this will result in all objects getting NotifyExpiredLocked called on them, |
279 | | * but if NotifyExpiredLocked itself marks some objects as used, then those |
280 | | * objects might not expire. This would be a good thing to call if we get into |
281 | | * a critically-low memory situation. |
282 | | */ |
283 | | void AgeAllGenerationsLocked(const AutoLock& aAutoLock) |
284 | 0 | { |
285 | 0 | uint32_t i; |
286 | 0 | for (i = 0; i < K; ++i) { |
287 | 0 | AgeOneGenerationLocked(aAutoLock); |
288 | 0 | } |
289 | 0 | } Unexecuted instantiation: ExpirationTrackerImpl<gfxFont, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeAllGenerationsLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::ActiveResource, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeAllGenerationsLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::TileClient, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeAllGenerationsLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<BlurCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeAllGenerationsLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::gfx::GradientCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeAllGenerationsLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::image::CachedSurface, 2u, mozilla::BaseStaticMutex<(mozilla::recordreplay::Behavior)1>, mozilla::BaseAutoLock<mozilla::AnyStaticMutex> >::AgeAllGenerationsLocked(mozilla::BaseAutoLock<mozilla::AnyStaticMutex> const&) Unexecuted instantiation: ExpirationTrackerImpl<imgCacheEntry, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeAllGenerationsLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<nsIDocument::SelectorCacheKey, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeAllGenerationsLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ImageCacheEntryData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeAllGenerationsLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ScrollFrameHelper, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeAllGenerationsLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::LayerActivity, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeAllGenerationsLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<nsSHEntryShared, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeAllGenerationsLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeAllGenerationsLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeAllGenerationsLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 8u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::AgeAllGenerationsLocked(detail::PlaceholderAutoLock const&) |
290 | | |
291 | | class Iterator |
292 | | { |
293 | | private: |
294 | | ExpirationTrackerImpl<T, K, Mutex, AutoLock>* mTracker; |
295 | | uint32_t mGeneration; |
296 | | uint32_t mIndex; |
297 | | public: |
298 | | Iterator(ExpirationTrackerImpl<T, K, Mutex, AutoLock>* aTracker, |
299 | | AutoLock& aAutoLock) |
300 | | : mTracker(aTracker) |
301 | | , mGeneration(0) |
302 | | , mIndex(0) |
303 | | { |
304 | | } |
305 | | |
306 | | T* Next() |
307 | | { |
308 | | while (mGeneration < K) { |
309 | | nsTArray<T*>* generation = &mTracker->mGenerations[mGeneration]; |
310 | | if (mIndex < generation->Length()) { |
311 | | ++mIndex; |
312 | | return (*generation)[mIndex - 1]; |
313 | | } |
314 | | ++mGeneration; |
315 | | mIndex = 0; |
316 | | } |
317 | | return nullptr; |
318 | | } |
319 | | }; |
320 | | |
321 | | friend class Iterator; |
322 | | |
323 | | bool IsEmptyLocked(const AutoLock& aAutoLock) |
324 | 0 | { |
325 | 0 | for (uint32_t i = 0; i < K; ++i) { |
326 | 0 | if (!mGenerations[i].IsEmpty()) { |
327 | 0 | return false; |
328 | 0 | } |
329 | 0 | } |
330 | 0 | return true; |
331 | 0 | } Unexecuted instantiation: ExpirationTrackerImpl<nsIDocument::SelectorCacheKey, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::IsEmptyLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<gfxFont, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::IsEmptyLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::ActiveResource, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::IsEmptyLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::TileClient, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::IsEmptyLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<BlurCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::IsEmptyLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::gfx::GradientCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::IsEmptyLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::image::CachedSurface, 2u, mozilla::BaseStaticMutex<(mozilla::recordreplay::Behavior)1>, mozilla::BaseAutoLock<mozilla::AnyStaticMutex> >::IsEmptyLocked(mozilla::BaseAutoLock<mozilla::AnyStaticMutex> const&) Unexecuted instantiation: ExpirationTrackerImpl<imgCacheEntry, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::IsEmptyLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ImageCacheEntryData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::IsEmptyLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ScrollFrameHelper, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::IsEmptyLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::LayerActivity, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::IsEmptyLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<nsSHEntryShared, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::IsEmptyLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::IsEmptyLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::IsEmptyLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 8u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::IsEmptyLocked(detail::PlaceholderAutoLock const&) |
332 | | |
333 | | protected: |
334 | | /** |
335 | | * This must be overridden to catch notifications. It is called whenever |
336 | | * we detect that an object has not been used for at least (K-1)*mTimerPeriod |
337 | | * milliseconds. If timer events are not delayed, it will be called within |
338 | | * roughly K*mTimerPeriod milliseconds after the last use. |
339 | | * (Unless AgeOneGenerationLocked or AgeAllGenerationsLocked have been called |
340 | | * to accelerate the aging process.) |
341 | | * |
342 | | * NOTE: These bounds ignore delays in timer firings due to actual work being |
343 | | * performed by the browser. We use a slack timer so there is always at least |
344 | | * mTimerPeriod milliseconds between firings, which gives us (K-1)*mTimerPeriod |
345 | | * as a pretty solid lower bound. The upper bound is rather loose, however. |
346 | | * If the maximum amount by which any given timer firing is delayed is D, then |
347 | | * the upper bound before NotifyExpiredLocked is called is K*(mTimerPeriod + D). |
348 | | * |
349 | | * The NotifyExpiredLocked call is expected to remove the object from the tracker, |
350 | | * but it need not. The object (or other objects) could be "resurrected" |
351 | | * by calling MarkUsedLocked() on them, or they might just not be removed. |
352 | | * Any objects left over that have not been resurrected or removed |
353 | | * are placed in the new newest-generation, but this is considered "bad form" |
354 | | * and should be avoided (we'll issue a warning). (This recycling counts |
355 | | * as "a use" for the purposes of the expiry guarantee above...) |
356 | | * |
357 | | * For robustness and simplicity, we allow objects to be notified more than |
358 | | * once here in the same timer tick. |
359 | | */ |
360 | | virtual void NotifyExpiredLocked(T*, const AutoLock&) = 0; |
361 | | |
362 | | /** |
363 | | * This may be overridden to perform any post-aging work that needs to be |
364 | | * done while still holding the lock. It will be called once after each timer |
365 | | * event, and each low memory event has been handled. |
366 | | */ |
367 | 0 | virtual void NotifyHandlerEndLocked(const AutoLock&) { }; Unexecuted instantiation: ExpirationTrackerImpl<nsIDocument::SelectorCacheKey, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<gfxFont, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::ActiveResource, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::TileClient, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<BlurCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::gfx::GradientCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::image::CachedSurface, 2u, mozilla::BaseStaticMutex<(mozilla::recordreplay::Behavior)1>, mozilla::BaseAutoLock<mozilla::AnyStaticMutex> >::NotifyHandlerEndLocked(mozilla::BaseAutoLock<mozilla::AnyStaticMutex> const&) Unexecuted instantiation: ExpirationTrackerImpl<imgCacheEntry, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ImageCacheEntryData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ScrollFrameHelper, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::LayerActivity, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<nsSHEntryShared, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 8u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) |
368 | | |
369 | | /** |
370 | | * This may be overridden to perform any post-aging work that needs to be |
371 | | * done outside the lock. It will be called once after each |
372 | | * NotifyEndTransactionLocked call. |
373 | | */ |
374 | 0 | virtual void NotifyHandlerEnd() { }; Unexecuted instantiation: ExpirationTrackerImpl<nsIDocument::SelectorCacheKey, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEnd() Unexecuted instantiation: ExpirationTrackerImpl<gfxFont, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEnd() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::ActiveResource, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEnd() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::TileClient, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEnd() Unexecuted instantiation: ExpirationTrackerImpl<BlurCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEnd() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::gfx::GradientCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEnd() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::image::CachedSurface, 2u, mozilla::BaseStaticMutex<(mozilla::recordreplay::Behavior)1>, mozilla::BaseAutoLock<mozilla::AnyStaticMutex> >::NotifyHandlerEnd() Unexecuted instantiation: ExpirationTrackerImpl<imgCacheEntry, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEnd() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ImageCacheEntryData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEnd() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ScrollFrameHelper, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEnd() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::LayerActivity, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEnd() Unexecuted instantiation: ExpirationTrackerImpl<nsSHEntryShared, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEnd() Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEnd() Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEnd() Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 8u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::NotifyHandlerEnd() |
375 | | |
376 | | virtual Mutex& GetMutex() = 0; |
377 | | |
378 | | private: |
379 | | class ExpirationTrackerObserver; |
380 | | RefPtr<ExpirationTrackerObserver> mObserver; |
381 | | nsTArray<T*> mGenerations[K]; |
382 | | nsCOMPtr<nsITimer> mTimer; |
383 | | uint32_t mTimerPeriod; |
384 | | uint32_t mNewestGeneration; |
385 | | bool mInAgeOneGeneration; |
386 | | const char* const mName; // Used for timer firing profiling. |
387 | | const nsCOMPtr<nsIEventTarget> mEventTarget; |
388 | | |
389 | | /** |
390 | | * Whenever "memory-pressure" is observed, it calls AgeAllGenerationsLocked() |
391 | | * to minimize memory usage. |
392 | | */ |
393 | | class ExpirationTrackerObserver final : public nsIObserver |
394 | | { |
395 | | public: |
396 | | void Init(ExpirationTrackerImpl<T, K, Mutex, AutoLock>* aObj) |
397 | 0 | { |
398 | 0 | mOwner = aObj; |
399 | 0 | nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService(); |
400 | 0 | if (obs) { |
401 | 0 | obs->AddObserver(this, "memory-pressure", false); |
402 | 0 | } |
403 | 0 | } Unexecuted instantiation: ExpirationTrackerImpl<gfxFont, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Init(ExpirationTrackerImpl<gfxFont, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::ActiveResource, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Init(ExpirationTrackerImpl<mozilla::layers::ActiveResource, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::TileClient, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Init(ExpirationTrackerImpl<mozilla::layers::TileClient, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>*) Unexecuted instantiation: ExpirationTrackerImpl<BlurCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Init(ExpirationTrackerImpl<BlurCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::gfx::GradientCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Init(ExpirationTrackerImpl<mozilla::gfx::GradientCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::image::CachedSurface, 2u, mozilla::BaseStaticMutex<(mozilla::recordreplay::Behavior)1>, mozilla::BaseAutoLock<mozilla::AnyStaticMutex> >::ExpirationTrackerObserver::Init(ExpirationTrackerImpl<mozilla::image::CachedSurface, 2u, mozilla::BaseStaticMutex<(mozilla::recordreplay::Behavior)1>, mozilla::BaseAutoLock<mozilla::AnyStaticMutex> >*) Unexecuted instantiation: ExpirationTrackerImpl<imgCacheEntry, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Init(ExpirationTrackerImpl<imgCacheEntry, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>*) Unexecuted instantiation: ExpirationTrackerImpl<nsIDocument::SelectorCacheKey, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Init(ExpirationTrackerImpl<nsIDocument::SelectorCacheKey, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ImageCacheEntryData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Init(ExpirationTrackerImpl<mozilla::ImageCacheEntryData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ScrollFrameHelper, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Init(ExpirationTrackerImpl<mozilla::ScrollFrameHelper, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::LayerActivity, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Init(ExpirationTrackerImpl<mozilla::LayerActivity, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>*) Unexecuted instantiation: ExpirationTrackerImpl<nsSHEntryShared, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Init(ExpirationTrackerImpl<nsSHEntryShared, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>*) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Init(ExpirationTrackerImpl<TestExpirationTracker::Object, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>*) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Init(ExpirationTrackerImpl<TestExpirationTracker::Object, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>*) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 8u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Init(ExpirationTrackerImpl<TestExpirationTracker::Object, 8u, detail::PlaceholderLock, detail::PlaceholderAutoLock>*) |
404 | | void Destroy() |
405 | 0 | { |
406 | 0 | mOwner = nullptr; |
407 | 0 | nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService(); |
408 | 0 | if (obs) { |
409 | 0 | obs->RemoveObserver(this, "memory-pressure"); |
410 | 0 | } |
411 | 0 | } Unexecuted instantiation: ExpirationTrackerImpl<gfxFont, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Destroy() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::ActiveResource, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Destroy() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::TileClient, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Destroy() Unexecuted instantiation: ExpirationTrackerImpl<BlurCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Destroy() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::gfx::GradientCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Destroy() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::image::CachedSurface, 2u, mozilla::BaseStaticMutex<(mozilla::recordreplay::Behavior)1>, mozilla::BaseAutoLock<mozilla::AnyStaticMutex> >::ExpirationTrackerObserver::Destroy() Unexecuted instantiation: ExpirationTrackerImpl<imgCacheEntry, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Destroy() Unexecuted instantiation: ExpirationTrackerImpl<nsIDocument::SelectorCacheKey, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Destroy() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ImageCacheEntryData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Destroy() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ScrollFrameHelper, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Destroy() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::LayerActivity, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Destroy() Unexecuted instantiation: ExpirationTrackerImpl<nsSHEntryShared, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Destroy() Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Destroy() Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Destroy() Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 8u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Destroy() |
412 | | NS_DECL_ISUPPORTS |
413 | | NS_DECL_NSIOBSERVER |
414 | | private: |
415 | | ExpirationTrackerImpl<T, K, Mutex, AutoLock>* mOwner; |
416 | | }; |
417 | | |
418 | 0 | void HandleLowMemory() { |
419 | 0 | { |
420 | 0 | AutoLock lock(GetMutex()); |
421 | 0 | AgeAllGenerationsLocked(lock); |
422 | 0 | NotifyHandlerEndLocked(lock); |
423 | 0 | } |
424 | 0 | NotifyHandlerEnd(); |
425 | 0 | } Unexecuted instantiation: ExpirationTrackerImpl<gfxFont, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleLowMemory() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::ActiveResource, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleLowMemory() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::TileClient, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleLowMemory() Unexecuted instantiation: ExpirationTrackerImpl<BlurCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleLowMemory() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::gfx::GradientCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleLowMemory() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::image::CachedSurface, 2u, mozilla::BaseStaticMutex<(mozilla::recordreplay::Behavior)1>, mozilla::BaseAutoLock<mozilla::AnyStaticMutex> >::HandleLowMemory() Unexecuted instantiation: ExpirationTrackerImpl<imgCacheEntry, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleLowMemory() Unexecuted instantiation: ExpirationTrackerImpl<nsIDocument::SelectorCacheKey, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleLowMemory() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ImageCacheEntryData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleLowMemory() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ScrollFrameHelper, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleLowMemory() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::LayerActivity, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleLowMemory() Unexecuted instantiation: ExpirationTrackerImpl<nsSHEntryShared, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleLowMemory() Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleLowMemory() Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleLowMemory() Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 8u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleLowMemory() |
426 | | |
427 | 0 | void HandleTimeout() { |
428 | 0 | { |
429 | 0 | AutoLock lock(GetMutex()); |
430 | 0 | AgeOneGenerationLocked(lock); |
431 | 0 | // Cancel the timer if we have no objects to track |
432 | 0 | if (IsEmptyLocked(lock)) { |
433 | 0 | mTimer->Cancel(); |
434 | 0 | mTimer = nullptr; |
435 | 0 | } |
436 | 0 | NotifyHandlerEndLocked(lock); |
437 | 0 | } |
438 | 0 | NotifyHandlerEnd(); |
439 | 0 | } Unexecuted instantiation: ExpirationTrackerImpl<nsIDocument::SelectorCacheKey, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleTimeout() Unexecuted instantiation: ExpirationTrackerImpl<gfxFont, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleTimeout() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::ActiveResource, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleTimeout() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::TileClient, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleTimeout() Unexecuted instantiation: ExpirationTrackerImpl<BlurCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleTimeout() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::gfx::GradientCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleTimeout() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::image::CachedSurface, 2u, mozilla::BaseStaticMutex<(mozilla::recordreplay::Behavior)1>, mozilla::BaseAutoLock<mozilla::AnyStaticMutex> >::HandleTimeout() Unexecuted instantiation: ExpirationTrackerImpl<imgCacheEntry, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleTimeout() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ImageCacheEntryData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleTimeout() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ScrollFrameHelper, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleTimeout() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::LayerActivity, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleTimeout() Unexecuted instantiation: ExpirationTrackerImpl<nsSHEntryShared, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleTimeout() Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleTimeout() Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleTimeout() Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 8u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::HandleTimeout() |
440 | | |
441 | | static void TimerCallback(nsITimer* aTimer, void* aThis) |
442 | 0 | { |
443 | 0 | ExpirationTrackerImpl* tracker = static_cast<ExpirationTrackerImpl*>(aThis); |
444 | 0 | tracker->HandleTimeout(); |
445 | 0 | } Unexecuted instantiation: ExpirationTrackerImpl<nsIDocument::SelectorCacheKey, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::TimerCallback(nsITimer*, void*) Unexecuted instantiation: ExpirationTrackerImpl<gfxFont, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::TimerCallback(nsITimer*, void*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::ActiveResource, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::TimerCallback(nsITimer*, void*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::TileClient, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::TimerCallback(nsITimer*, void*) Unexecuted instantiation: ExpirationTrackerImpl<BlurCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::TimerCallback(nsITimer*, void*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::gfx::GradientCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::TimerCallback(nsITimer*, void*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::image::CachedSurface, 2u, mozilla::BaseStaticMutex<(mozilla::recordreplay::Behavior)1>, mozilla::BaseAutoLock<mozilla::AnyStaticMutex> >::TimerCallback(nsITimer*, void*) Unexecuted instantiation: ExpirationTrackerImpl<imgCacheEntry, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::TimerCallback(nsITimer*, void*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ImageCacheEntryData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::TimerCallback(nsITimer*, void*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ScrollFrameHelper, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::TimerCallback(nsITimer*, void*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::LayerActivity, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::TimerCallback(nsITimer*, void*) Unexecuted instantiation: ExpirationTrackerImpl<nsSHEntryShared, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::TimerCallback(nsITimer*, void*) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::TimerCallback(nsITimer*, void*) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::TimerCallback(nsITimer*, void*) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 8u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::TimerCallback(nsITimer*, void*) |
446 | | |
447 | | nsresult CheckStartTimerLocked(const AutoLock& aAutoLock) |
448 | 0 | { |
449 | 0 | if (mTimer || !mTimerPeriod) { |
450 | 0 | return NS_OK; |
451 | 0 | } |
452 | 0 | nsCOMPtr<nsIEventTarget> target = mEventTarget; |
453 | 0 | if (!target && !NS_IsMainThread()) { |
454 | 0 | // TimerCallback should always be run on the main thread to prevent races |
455 | 0 | // to the destruction of the tracker. |
456 | 0 | target = do_GetMainThread(); |
457 | 0 | NS_ENSURE_STATE(target); |
458 | 0 | } |
459 | 0 |
|
460 | 0 | return NS_NewTimerWithFuncCallback( |
461 | 0 | getter_AddRefs(mTimer), |
462 | 0 | TimerCallback, |
463 | 0 | this, |
464 | 0 | mTimerPeriod, |
465 | 0 | nsITimer::TYPE_REPEATING_SLACK_LOW_PRIORITY, |
466 | 0 | mName, |
467 | 0 | target); |
468 | 0 | } Unexecuted instantiation: ExpirationTrackerImpl<nsIDocument::SelectorCacheKey, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::CheckStartTimerLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<gfxFont, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::CheckStartTimerLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::ActiveResource, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::CheckStartTimerLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::TileClient, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::CheckStartTimerLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<BlurCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::CheckStartTimerLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::gfx::GradientCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::CheckStartTimerLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::image::CachedSurface, 2u, mozilla::BaseStaticMutex<(mozilla::recordreplay::Behavior)1>, mozilla::BaseAutoLock<mozilla::AnyStaticMutex> >::CheckStartTimerLocked(mozilla::BaseAutoLock<mozilla::AnyStaticMutex> const&) Unexecuted instantiation: ExpirationTrackerImpl<imgCacheEntry, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::CheckStartTimerLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ImageCacheEntryData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::CheckStartTimerLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ScrollFrameHelper, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::CheckStartTimerLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::LayerActivity, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::CheckStartTimerLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<nsSHEntryShared, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::CheckStartTimerLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::CheckStartTimerLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::CheckStartTimerLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 8u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::CheckStartTimerLocked(detail::PlaceholderAutoLock const&) |
469 | | }; |
470 | | |
471 | | namespace detail { |
472 | | |
473 | | class PlaceholderLock { |
474 | | public: |
475 | 0 | void Lock() {} |
476 | 0 | void Unlock() {} |
477 | | }; |
478 | | |
479 | | class PlaceholderAutoLock { |
480 | | public: |
481 | 0 | explicit PlaceholderAutoLock(PlaceholderLock&) { } |
482 | | ~PlaceholderAutoLock() = default; |
483 | | |
484 | | }; |
485 | | |
486 | | template<typename T, uint32_t K> |
487 | | using SingleThreadedExpirationTracker = |
488 | | ExpirationTrackerImpl<T, K, PlaceholderLock, PlaceholderAutoLock>; |
489 | | |
490 | | } // namespace detail |
491 | | |
492 | | template<typename T, uint32_t K> |
493 | | class nsExpirationTracker : protected ::detail::SingleThreadedExpirationTracker<T, K> |
494 | | { |
495 | | typedef ::detail::PlaceholderLock Lock; |
496 | | typedef ::detail::PlaceholderAutoLock AutoLock; |
497 | | |
498 | | Lock mLock; |
499 | | |
500 | 0 | AutoLock FakeLock() { |
501 | 0 | MOZ_DIAGNOSTIC_ASSERT(NS_IsMainThread()); |
502 | 0 | return AutoLock(mLock); |
503 | 0 | } Unexecuted instantiation: nsExpirationTracker<nsIDocument::SelectorCacheKey, 4u>::FakeLock() Unexecuted instantiation: nsExpirationTracker<mozilla::layers::ActiveResource, 3u>::FakeLock() Unexecuted instantiation: nsExpirationTracker<mozilla::layers::TileClient, 3u>::FakeLock() Unexecuted instantiation: nsExpirationTracker<BlurCacheData, 4u>::FakeLock() Unexecuted instantiation: nsExpirationTracker<mozilla::gfx::GradientCacheData, 4u>::FakeLock() Unexecuted instantiation: nsExpirationTracker<imgCacheEntry, 3u>::FakeLock() Unexecuted instantiation: nsExpirationTracker<mozilla::ImageCacheEntryData, 4u>::FakeLock() Unexecuted instantiation: nsExpirationTracker<mozilla::ScrollFrameHelper, 4u>::FakeLock() Unexecuted instantiation: nsExpirationTracker<mozilla::LayerActivity, 4u>::FakeLock() Unexecuted instantiation: nsExpirationTracker<nsSHEntryShared, 3u>::FakeLock() Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 3u>::FakeLock() Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 4u>::FakeLock() Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 8u>::FakeLock() |
504 | | |
505 | | Lock& GetMutex() override |
506 | 0 | { |
507 | 0 | MOZ_DIAGNOSTIC_ASSERT(NS_IsMainThread()); |
508 | 0 | return mLock; |
509 | 0 | } Unexecuted instantiation: nsExpirationTracker<mozilla::layers::ActiveResource, 3u>::GetMutex() Unexecuted instantiation: nsExpirationTracker<mozilla::layers::TileClient, 3u>::GetMutex() Unexecuted instantiation: nsExpirationTracker<BlurCacheData, 4u>::GetMutex() Unexecuted instantiation: nsExpirationTracker<mozilla::gfx::GradientCacheData, 4u>::GetMutex() Unexecuted instantiation: nsExpirationTracker<imgCacheEntry, 3u>::GetMutex() Unexecuted instantiation: nsExpirationTracker<nsIDocument::SelectorCacheKey, 4u>::GetMutex() Unexecuted instantiation: nsExpirationTracker<mozilla::ImageCacheEntryData, 4u>::GetMutex() Unexecuted instantiation: nsExpirationTracker<mozilla::ScrollFrameHelper, 4u>::GetMutex() Unexecuted instantiation: nsExpirationTracker<mozilla::LayerActivity, 4u>::GetMutex() Unexecuted instantiation: nsExpirationTracker<nsSHEntryShared, 3u>::GetMutex() Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 3u>::GetMutex() Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 4u>::GetMutex() Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 8u>::GetMutex() |
510 | | |
511 | | void NotifyExpiredLocked(T* aObject, const AutoLock&) override |
512 | 0 | { |
513 | 0 | NotifyExpired(aObject); |
514 | 0 | } Unexecuted instantiation: nsExpirationTracker<mozilla::layers::ActiveResource, 3u>::NotifyExpiredLocked(mozilla::layers::ActiveResource*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: nsExpirationTracker<mozilla::layers::TileClient, 3u>::NotifyExpiredLocked(mozilla::layers::TileClient*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: nsExpirationTracker<BlurCacheData, 4u>::NotifyExpiredLocked(BlurCacheData*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: nsExpirationTracker<mozilla::gfx::GradientCacheData, 4u>::NotifyExpiredLocked(mozilla::gfx::GradientCacheData*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: nsExpirationTracker<imgCacheEntry, 3u>::NotifyExpiredLocked(imgCacheEntry*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: nsExpirationTracker<nsIDocument::SelectorCacheKey, 4u>::NotifyExpiredLocked(nsIDocument::SelectorCacheKey*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: nsExpirationTracker<mozilla::ImageCacheEntryData, 4u>::NotifyExpiredLocked(mozilla::ImageCacheEntryData*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: nsExpirationTracker<mozilla::ScrollFrameHelper, 4u>::NotifyExpiredLocked(mozilla::ScrollFrameHelper*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: nsExpirationTracker<mozilla::LayerActivity, 4u>::NotifyExpiredLocked(mozilla::LayerActivity*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: nsExpirationTracker<nsSHEntryShared, 3u>::NotifyExpiredLocked(nsSHEntryShared*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 3u>::NotifyExpiredLocked(TestExpirationTracker::Object*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 4u>::NotifyExpiredLocked(TestExpirationTracker::Object*, detail::PlaceholderAutoLock const&) Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 8u>::NotifyExpiredLocked(TestExpirationTracker::Object*, detail::PlaceholderAutoLock const&) |
515 | | |
516 | | /** |
517 | | * Since there are no users of these callbacks in the single threaded case, |
518 | | * we mark them as final with the hope that the compiler can optimize the |
519 | | * method calls out entirely. |
520 | | */ |
521 | 0 | void NotifyHandlerEndLocked(const AutoLock&) final { } Unexecuted instantiation: nsExpirationTracker<mozilla::layers::ActiveResource, 3u>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: nsExpirationTracker<mozilla::layers::TileClient, 3u>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: nsExpirationTracker<BlurCacheData, 4u>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: nsExpirationTracker<mozilla::gfx::GradientCacheData, 4u>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: nsExpirationTracker<imgCacheEntry, 3u>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: nsExpirationTracker<nsIDocument::SelectorCacheKey, 4u>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: nsExpirationTracker<mozilla::ImageCacheEntryData, 4u>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: nsExpirationTracker<mozilla::ScrollFrameHelper, 4u>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: nsExpirationTracker<mozilla::LayerActivity, 4u>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: nsExpirationTracker<nsSHEntryShared, 3u>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 3u>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 4u>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 8u>::NotifyHandlerEndLocked(detail::PlaceholderAutoLock const&) |
522 | 0 | void NotifyHandlerEnd() final { } Unexecuted instantiation: nsExpirationTracker<mozilla::layers::ActiveResource, 3u>::NotifyHandlerEnd() Unexecuted instantiation: nsExpirationTracker<mozilla::layers::TileClient, 3u>::NotifyHandlerEnd() Unexecuted instantiation: nsExpirationTracker<BlurCacheData, 4u>::NotifyHandlerEnd() Unexecuted instantiation: nsExpirationTracker<mozilla::gfx::GradientCacheData, 4u>::NotifyHandlerEnd() Unexecuted instantiation: nsExpirationTracker<imgCacheEntry, 3u>::NotifyHandlerEnd() Unexecuted instantiation: nsExpirationTracker<nsIDocument::SelectorCacheKey, 4u>::NotifyHandlerEnd() Unexecuted instantiation: nsExpirationTracker<mozilla::ImageCacheEntryData, 4u>::NotifyHandlerEnd() Unexecuted instantiation: nsExpirationTracker<mozilla::ScrollFrameHelper, 4u>::NotifyHandlerEnd() Unexecuted instantiation: nsExpirationTracker<mozilla::LayerActivity, 4u>::NotifyHandlerEnd() Unexecuted instantiation: nsExpirationTracker<nsSHEntryShared, 3u>::NotifyHandlerEnd() Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 3u>::NotifyHandlerEnd() Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 4u>::NotifyHandlerEnd() Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 8u>::NotifyHandlerEnd() |
523 | | |
524 | | protected: |
525 | | virtual void NotifyExpired(T* aObj) = 0; |
526 | | |
527 | | public: |
528 | | nsExpirationTracker(uint32_t aTimerPeriod, |
529 | | const char* aName, |
530 | | nsIEventTarget* aEventTarget = nullptr) |
531 | | : ::detail::SingleThreadedExpirationTracker<T, K>(aTimerPeriod, |
532 | | aName, |
533 | | aEventTarget) |
534 | 0 | { } Unexecuted instantiation: nsExpirationTracker<mozilla::layers::ActiveResource, 3u>::nsExpirationTracker(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: nsExpirationTracker<mozilla::layers::TileClient, 3u>::nsExpirationTracker(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: nsExpirationTracker<BlurCacheData, 4u>::nsExpirationTracker(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: nsExpirationTracker<mozilla::gfx::GradientCacheData, 4u>::nsExpirationTracker(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: nsExpirationTracker<imgCacheEntry, 3u>::nsExpirationTracker(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: nsExpirationTracker<nsIDocument::SelectorCacheKey, 4u>::nsExpirationTracker(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: nsExpirationTracker<mozilla::ImageCacheEntryData, 4u>::nsExpirationTracker(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: nsExpirationTracker<mozilla::ScrollFrameHelper, 4u>::nsExpirationTracker(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: nsExpirationTracker<mozilla::LayerActivity, 4u>::nsExpirationTracker(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: nsExpirationTracker<nsSHEntryShared, 3u>::nsExpirationTracker(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 3u>::nsExpirationTracker(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 4u>::nsExpirationTracker(unsigned int, char const*, nsIEventTarget*) Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 8u>::nsExpirationTracker(unsigned int, char const*, nsIEventTarget*) |
535 | | |
536 | | virtual ~nsExpirationTracker() |
537 | | { } |
538 | | |
539 | | nsresult AddObject(T* aObj) |
540 | 0 | { |
541 | 0 | return this->AddObjectLocked(aObj, FakeLock()); |
542 | 0 | } Unexecuted instantiation: nsExpirationTracker<nsIDocument::SelectorCacheKey, 4u>::AddObject(nsIDocument::SelectorCacheKey*) Unexecuted instantiation: nsExpirationTracker<mozilla::layers::ActiveResource, 3u>::AddObject(mozilla::layers::ActiveResource*) Unexecuted instantiation: nsExpirationTracker<mozilla::layers::TileClient, 3u>::AddObject(mozilla::layers::TileClient*) Unexecuted instantiation: nsExpirationTracker<BlurCacheData, 4u>::AddObject(BlurCacheData*) Unexecuted instantiation: nsExpirationTracker<mozilla::gfx::GradientCacheData, 4u>::AddObject(mozilla::gfx::GradientCacheData*) Unexecuted instantiation: nsExpirationTracker<imgCacheEntry, 3u>::AddObject(imgCacheEntry*) Unexecuted instantiation: nsExpirationTracker<mozilla::ImageCacheEntryData, 4u>::AddObject(mozilla::ImageCacheEntryData*) Unexecuted instantiation: nsExpirationTracker<mozilla::ScrollFrameHelper, 4u>::AddObject(mozilla::ScrollFrameHelper*) Unexecuted instantiation: nsExpirationTracker<mozilla::LayerActivity, 4u>::AddObject(mozilla::LayerActivity*) Unexecuted instantiation: nsExpirationTracker<nsSHEntryShared, 3u>::AddObject(nsSHEntryShared*) Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 3u>::AddObject(TestExpirationTracker::Object*) Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 4u>::AddObject(TestExpirationTracker::Object*) Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 8u>::AddObject(TestExpirationTracker::Object*) |
543 | | |
544 | | void RemoveObject(T* aObj) |
545 | 0 | { |
546 | 0 | this->RemoveObjectLocked(aObj, FakeLock()); |
547 | 0 | } Unexecuted instantiation: nsExpirationTracker<mozilla::layers::ActiveResource, 3u>::RemoveObject(mozilla::layers::ActiveResource*) Unexecuted instantiation: nsExpirationTracker<mozilla::layers::TileClient, 3u>::RemoveObject(mozilla::layers::TileClient*) Unexecuted instantiation: nsExpirationTracker<BlurCacheData, 4u>::RemoveObject(BlurCacheData*) Unexecuted instantiation: nsExpirationTracker<mozilla::gfx::GradientCacheData, 4u>::RemoveObject(mozilla::gfx::GradientCacheData*) Unexecuted instantiation: nsExpirationTracker<imgCacheEntry, 3u>::RemoveObject(imgCacheEntry*) Unexecuted instantiation: nsExpirationTracker<nsIDocument::SelectorCacheKey, 4u>::RemoveObject(nsIDocument::SelectorCacheKey*) Unexecuted instantiation: nsExpirationTracker<mozilla::ImageCacheEntryData, 4u>::RemoveObject(mozilla::ImageCacheEntryData*) Unexecuted instantiation: nsExpirationTracker<mozilla::ScrollFrameHelper, 4u>::RemoveObject(mozilla::ScrollFrameHelper*) Unexecuted instantiation: nsExpirationTracker<mozilla::LayerActivity, 4u>::RemoveObject(mozilla::LayerActivity*) Unexecuted instantiation: nsExpirationTracker<nsSHEntryShared, 3u>::RemoveObject(nsSHEntryShared*) Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 3u>::RemoveObject(TestExpirationTracker::Object*) Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 4u>::RemoveObject(TestExpirationTracker::Object*) Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 8u>::RemoveObject(TestExpirationTracker::Object*) |
548 | | |
549 | | nsresult MarkUsed(T* aObj) |
550 | 0 | { |
551 | 0 | return this->MarkUsedLocked(aObj, FakeLock()); |
552 | 0 | } Unexecuted instantiation: nsExpirationTracker<mozilla::layers::ActiveResource, 3u>::MarkUsed(mozilla::layers::ActiveResource*) Unexecuted instantiation: nsExpirationTracker<BlurCacheData, 4u>::MarkUsed(BlurCacheData*) Unexecuted instantiation: nsExpirationTracker<mozilla::gfx::GradientCacheData, 4u>::MarkUsed(mozilla::gfx::GradientCacheData*) Unexecuted instantiation: nsExpirationTracker<imgCacheEntry, 3u>::MarkUsed(imgCacheEntry*) Unexecuted instantiation: nsExpirationTracker<mozilla::ImageCacheEntryData, 4u>::MarkUsed(mozilla::ImageCacheEntryData*) Unexecuted instantiation: nsExpirationTracker<mozilla::ScrollFrameHelper, 4u>::MarkUsed(mozilla::ScrollFrameHelper*) Unexecuted instantiation: nsExpirationTracker<mozilla::LayerActivity, 4u>::MarkUsed(mozilla::LayerActivity*) Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 3u>::MarkUsed(TestExpirationTracker::Object*) Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 4u>::MarkUsed(TestExpirationTracker::Object*) Unexecuted instantiation: nsExpirationTracker<TestExpirationTracker::Object, 8u>::MarkUsed(TestExpirationTracker::Object*) |
553 | | |
554 | | void AgeOneGeneration() |
555 | 0 | { |
556 | 0 | this->AgeOneGenerationLocked(FakeLock()); |
557 | 0 | } |
558 | | |
559 | | void AgeAllGenerations() |
560 | 0 | { |
561 | 0 | this->AgeAllGenerationsLocked(FakeLock()); |
562 | 0 | } Unexecuted instantiation: nsExpirationTracker<mozilla::gfx::GradientCacheData, 4u>::AgeAllGenerations() Unexecuted instantiation: nsExpirationTracker<nsIDocument::SelectorCacheKey, 4u>::AgeAllGenerations() Unexecuted instantiation: nsExpirationTracker<mozilla::ImageCacheEntryData, 4u>::AgeAllGenerations() Unexecuted instantiation: nsExpirationTracker<mozilla::ScrollFrameHelper, 4u>::AgeAllGenerations() Unexecuted instantiation: nsExpirationTracker<mozilla::LayerActivity, 4u>::AgeAllGenerations() Unexecuted instantiation: nsExpirationTracker<nsSHEntryShared, 3u>::AgeAllGenerations() |
563 | | |
564 | | class Iterator |
565 | | { |
566 | | private: |
567 | | AutoLock mAutoLock; |
568 | | typename ExpirationTrackerImpl<T, K, Lock, AutoLock>::Iterator mIterator; |
569 | | public: |
570 | | explicit Iterator(nsExpirationTracker<T, K>* aTracker) |
571 | | : mAutoLock(aTracker->GetMutex()) |
572 | | , mIterator(aTracker, mAutoLock) |
573 | | { |
574 | | } |
575 | | |
576 | | T* Next() |
577 | | { |
578 | | return mIterator.Next(); |
579 | | } |
580 | | }; |
581 | | |
582 | | friend class Iterator; |
583 | | |
584 | | bool IsEmpty() |
585 | 0 | { |
586 | 0 | return this->IsEmptyLocked(FakeLock()); |
587 | 0 | } |
588 | | }; |
589 | | |
590 | | template<typename T, uint32_t K, typename Mutex, typename AutoLock> |
591 | | NS_IMETHODIMP |
592 | | ExpirationTrackerImpl<T, K, Mutex, AutoLock>:: |
593 | | ExpirationTrackerObserver::Observe( |
594 | | nsISupports* aSubject, const char* aTopic, const char16_t* aData) |
595 | 0 | { |
596 | 0 | if (!strcmp(aTopic, "memory-pressure") && mOwner) { |
597 | 0 | mOwner->HandleLowMemory(); |
598 | 0 | } |
599 | 0 | return NS_OK; |
600 | 0 | } Unexecuted instantiation: ExpirationTrackerImpl<gfxFont, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Observe(nsISupports*, char const*, char16_t const*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::ActiveResource, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Observe(nsISupports*, char const*, char16_t const*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::TileClient, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Observe(nsISupports*, char const*, char16_t const*) Unexecuted instantiation: ExpirationTrackerImpl<BlurCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Observe(nsISupports*, char const*, char16_t const*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::gfx::GradientCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Observe(nsISupports*, char const*, char16_t const*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::image::CachedSurface, 2u, mozilla::BaseStaticMutex<(mozilla::recordreplay::Behavior)1>, mozilla::BaseAutoLock<mozilla::AnyStaticMutex> >::ExpirationTrackerObserver::Observe(nsISupports*, char const*, char16_t const*) Unexecuted instantiation: ExpirationTrackerImpl<imgCacheEntry, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Observe(nsISupports*, char const*, char16_t const*) Unexecuted instantiation: ExpirationTrackerImpl<nsIDocument::SelectorCacheKey, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Observe(nsISupports*, char const*, char16_t const*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ImageCacheEntryData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Observe(nsISupports*, char const*, char16_t const*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ScrollFrameHelper, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Observe(nsISupports*, char const*, char16_t const*) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::LayerActivity, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Observe(nsISupports*, char const*, char16_t const*) Unexecuted instantiation: ExpirationTrackerImpl<nsSHEntryShared, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Observe(nsISupports*, char const*, char16_t const*) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Observe(nsISupports*, char const*, char16_t const*) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Observe(nsISupports*, char const*, char16_t const*) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 8u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Observe(nsISupports*, char const*, char16_t const*) |
601 | | |
602 | | template<class T, uint32_t K, typename Mutex, typename AutoLock> |
603 | | NS_IMETHODIMP_(MozExternalRefCountType) |
604 | | ExpirationTrackerImpl<T, K, Mutex, AutoLock>:: |
605 | | ExpirationTrackerObserver::AddRef(void) |
606 | 0 | { |
607 | 0 | MOZ_ASSERT(int32_t(mRefCnt) >= 0, "illegal refcnt"); |
608 | 0 | NS_ASSERT_OWNINGTHREAD(ExpirationTrackerObserver); |
609 | 0 | ++mRefCnt; |
610 | 0 | NS_LOG_ADDREF(this, mRefCnt, "ExpirationTrackerObserver", sizeof(*this)); |
611 | 0 | return mRefCnt; |
612 | 0 | } Unexecuted instantiation: ExpirationTrackerImpl<gfxFont, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::AddRef() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::ActiveResource, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::AddRef() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::TileClient, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::AddRef() Unexecuted instantiation: ExpirationTrackerImpl<BlurCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::AddRef() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::gfx::GradientCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::AddRef() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::image::CachedSurface, 2u, mozilla::BaseStaticMutex<(mozilla::recordreplay::Behavior)1>, mozilla::BaseAutoLock<mozilla::AnyStaticMutex> >::ExpirationTrackerObserver::AddRef() Unexecuted instantiation: ExpirationTrackerImpl<imgCacheEntry, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::AddRef() Unexecuted instantiation: ExpirationTrackerImpl<nsIDocument::SelectorCacheKey, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::AddRef() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ImageCacheEntryData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::AddRef() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ScrollFrameHelper, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::AddRef() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::LayerActivity, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::AddRef() Unexecuted instantiation: ExpirationTrackerImpl<nsSHEntryShared, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::AddRef() Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::AddRef() Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::AddRef() Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 8u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::AddRef() |
613 | | |
614 | | template<class T, uint32_t K, typename Mutex, typename AutoLock> |
615 | | NS_IMETHODIMP_(MozExternalRefCountType) |
616 | | ExpirationTrackerImpl<T, K, Mutex, AutoLock>:: |
617 | | ExpirationTrackerObserver::Release(void) |
618 | 0 | { |
619 | 0 | MOZ_ASSERT(int32_t(mRefCnt) > 0, "dup release"); |
620 | 0 | NS_ASSERT_OWNINGTHREAD(ExpirationTrackerObserver); |
621 | 0 | --mRefCnt; |
622 | 0 | NS_LOG_RELEASE(this, mRefCnt, "ExpirationTrackerObserver"); |
623 | 0 | if (mRefCnt == 0) { |
624 | 0 | NS_ASSERT_OWNINGTHREAD(ExpirationTrackerObserver); |
625 | 0 | mRefCnt = 1; /* stabilize */ |
626 | 0 | delete (this); |
627 | 0 | return 0; |
628 | 0 | } |
629 | 0 | return mRefCnt; |
630 | 0 | } Unexecuted instantiation: ExpirationTrackerImpl<gfxFont, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Release() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::ActiveResource, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Release() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::TileClient, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Release() Unexecuted instantiation: ExpirationTrackerImpl<BlurCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Release() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::gfx::GradientCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Release() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::image::CachedSurface, 2u, mozilla::BaseStaticMutex<(mozilla::recordreplay::Behavior)1>, mozilla::BaseAutoLock<mozilla::AnyStaticMutex> >::ExpirationTrackerObserver::Release() Unexecuted instantiation: ExpirationTrackerImpl<imgCacheEntry, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Release() Unexecuted instantiation: ExpirationTrackerImpl<nsIDocument::SelectorCacheKey, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Release() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ImageCacheEntryData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Release() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ScrollFrameHelper, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Release() Unexecuted instantiation: ExpirationTrackerImpl<mozilla::LayerActivity, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Release() Unexecuted instantiation: ExpirationTrackerImpl<nsSHEntryShared, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Release() Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Release() Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Release() Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 8u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::Release() |
631 | | |
632 | | template<class T, uint32_t K, typename Mutex, typename AutoLock> |
633 | | NS_IMETHODIMP |
634 | | ExpirationTrackerImpl<T, K, Mutex, AutoLock>:: |
635 | | ExpirationTrackerObserver::QueryInterface( |
636 | | REFNSIID aIID, void** aInstancePtr) |
637 | 0 | { |
638 | 0 | NS_ASSERTION(aInstancePtr, |
639 | 0 | "QueryInterface requires a non-NULL destination!"); |
640 | 0 | nsresult rv = NS_ERROR_FAILURE; |
641 | 0 | NS_INTERFACE_TABLE(ExpirationTrackerObserver, nsIObserver) |
642 | 0 | return rv; |
643 | 0 | } Unexecuted instantiation: ExpirationTrackerImpl<gfxFont, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::QueryInterface(nsID const&, void**) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::ActiveResource, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::QueryInterface(nsID const&, void**) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::layers::TileClient, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::QueryInterface(nsID const&, void**) Unexecuted instantiation: ExpirationTrackerImpl<BlurCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::QueryInterface(nsID const&, void**) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::gfx::GradientCacheData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::QueryInterface(nsID const&, void**) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::image::CachedSurface, 2u, mozilla::BaseStaticMutex<(mozilla::recordreplay::Behavior)1>, mozilla::BaseAutoLock<mozilla::AnyStaticMutex> >::ExpirationTrackerObserver::QueryInterface(nsID const&, void**) Unexecuted instantiation: ExpirationTrackerImpl<imgCacheEntry, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::QueryInterface(nsID const&, void**) Unexecuted instantiation: ExpirationTrackerImpl<nsIDocument::SelectorCacheKey, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::QueryInterface(nsID const&, void**) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ImageCacheEntryData, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::QueryInterface(nsID const&, void**) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::ScrollFrameHelper, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::QueryInterface(nsID const&, void**) Unexecuted instantiation: ExpirationTrackerImpl<mozilla::LayerActivity, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::QueryInterface(nsID const&, void**) Unexecuted instantiation: ExpirationTrackerImpl<nsSHEntryShared, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::QueryInterface(nsID const&, void**) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 3u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::QueryInterface(nsID const&, void**) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 4u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::QueryInterface(nsID const&, void**) Unexecuted instantiation: ExpirationTrackerImpl<TestExpirationTracker::Object, 8u, detail::PlaceholderLock, detail::PlaceholderAutoLock>::ExpirationTrackerObserver::QueryInterface(nsID const&, void**) |
644 | | |
645 | | #endif /*NSEXPIRATIONTRACKER_H_*/ |