Coverage Report

Created: 2018-09-25 14:53

/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(&current)) ||
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_*/