Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/media/doctor/MultiWriterQueue.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 mozilla_MultiWriterQueue_h_
8
#define mozilla_MultiWriterQueue_h_
9
10
#include "mozilla/Atomics.h"
11
#include "mozilla/MemoryReporting.h"
12
#include "mozilla/Move.h"
13
#include "mozilla/Mutex.h"
14
#include "prthread.h"
15
#include "RollingNumber.h"
16
#include <cstdint>
17
18
namespace mozilla {
19
20
// Default reader locking strategy, using a mutex to ensure that concurrent
21
// PopAll calls won't overlap.
22
class MultiWriterQueueReaderLocking_Mutex
23
{
24
public:
25
  MultiWriterQueueReaderLocking_Mutex()
26
    : mMutex("MultiWriterQueueReaderLocking_Mutex")
27
0
  {
28
0
  }
29
0
  void Lock() { mMutex.Lock(); };
30
0
  void Unlock() { mMutex.Unlock(); };
31
32
private:
33
  Mutex mMutex;
34
};
35
36
// Reader non-locking strategy, trusting that PopAll will never be called
37
// concurrently (e.g., by only calling it from a specific thread).
38
class MultiWriterQueueReaderLocking_None
39
{
40
public:
41
#ifndef DEBUG
42
0
  void Lock(){};
43
0
  void Unlock(){};
44
#else
45
  // DEBUG-mode checks to catch concurrent misuses.
46
  void Lock() { MOZ_ASSERT(mLocked.compareExchange(false, true)); };
47
  void Unlock() { MOZ_ASSERT(mLocked.compareExchange(true, false)); };
48
49
private:
50
  Atomic<bool> mLocked{ false };
51
#endif
52
};
53
54
static constexpr uint32_t MultiWriterQueueDefaultBufferSize = 8192;
55
56
// Multi-writer, single-reader queue of elements of type `T`.
57
// Elements are bunched together in buffers of `BufferSize` elements.
58
//
59
// This queue is heavily optimized for pushing. In most cases pushes will only
60
// cost a couple of atomic reads and a few non-atomic reads. Worst cases:
61
// - Once per buffer, a push will allocate or reuse a buffer for later pushes;
62
// - During the above new-buffer push, other pushes will be blocked.
63
//
64
// By default, popping is protected by mutex; it may be disabled if popping is
65
// guaranteed never to be concurrent.
66
// In any case, popping will never negatively impact pushes.
67
// (However, *not* popping will add runtime costs, as unread buffers will not
68
// be freed, or made available to future pushes; Push functions provide
69
// feedback as to when popping would be most efficient.)
70
template<typename T,
71
         uint32_t BufferSize = MultiWriterQueueDefaultBufferSize,
72
         typename ReaderLocking = MultiWriterQueueReaderLocking_Mutex>
73
class MultiWriterQueue
74
{
75
  static_assert(BufferSize > 0, "0-sized MultiWriterQueue buffer");
76
77
public:
78
  // Constructor.
79
  // Allocates the initial buffer that will receive the first `BufferSize`
80
  // elements. Also allocates one reusable buffer, which will definitely be
81
  // needed after the first `BufferSize` elements have been pushed.
82
  // Ideally (if the reader can process each buffer quickly enough), there
83
  // won't be a need for more buffer allocations.
84
  MultiWriterQueue()
85
    : mBuffersCoverAtLeastUpTo(BufferSize - 1)
86
    , mMostRecentBuffer(new Buffer{})
87
    , mReusableBuffers(new Buffer{})
88
    , mOldestBuffer(static_cast<Buffer*>(mMostRecentBuffer))
89
    , mLiveBuffersStats(1)
90
    , mReusableBuffersStats(1)
91
    , mAllocatedBuffersStats(2)
92
0
  {
93
0
  }
Unexecuted instantiation: mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::MultiWriterQueue()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::MultiWriterQueue()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::MultiWriterQueue()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::MultiWriterQueue()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::MultiWriterQueue()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::MultiWriterQueue()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::MultiWriterQueue()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::MultiWriterQueue()
94
95
  ~MultiWriterQueue()
96
0
  {
97
0
    auto DestroyList = [](Buffer* aBuffer)
98
0
    {
99
0
      while (aBuffer) {
100
0
        Buffer* older = aBuffer->Older();
101
0
        delete aBuffer;
102
0
        aBuffer = older;
103
0
      }
104
0
    };
Unexecuted instantiation: mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::~MultiWriterQueue()::{lambda(mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer*)#1}::operator()(mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer*) const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::~MultiWriterQueue()::{lambda(mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*)#1}::operator()(mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*) const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::~MultiWriterQueue()::{lambda(mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*)#1}::operator()(mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*) const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::~MultiWriterQueue()::{lambda(mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*)#1}::operator()(mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*) const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::~MultiWriterQueue()::{lambda(mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*)#1}::operator()(mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*) const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::~MultiWriterQueue()::{lambda(mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*)#1}::operator()(mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*) const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::~MultiWriterQueue()::{lambda(mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer*)#1}::operator()(mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer*) const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::~MultiWriterQueue()::{lambda(mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer*)#1}::operator()(mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer*) const
105
0
    DestroyList(mMostRecentBuffer);
106
0
    DestroyList(mReusableBuffers);
107
0
  }
Unexecuted instantiation: mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::~MultiWriterQueue()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::~MultiWriterQueue()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::~MultiWriterQueue()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::~MultiWriterQueue()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::~MultiWriterQueue()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::~MultiWriterQueue()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::~MultiWriterQueue()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::~MultiWriterQueue()
108
109
  // We need the index to be order-resistant to overflow, i.e., numbers before
110
  // an overflow should test smaller-than numbers after the overflow.
111
  // This is because we keep pushing elements with increasing Index, and this
112
  // Index is used to find the appropriate buffer based on a range; and this
113
  // need to work smoothly when crossing the overflow boundary.
114
  using Index = RollingNumber<uint32_t>;
115
116
  // Pushes indicate whether they have just reached the end of a buffer.
117
  using DidReachEndOfBuffer = bool;
118
119
  // Push new element and call aF on it.
120
  // Element may be in just-created state, or recycled after a PopAll call.
121
  // Atomically thread-safe; in the worst case some pushes may be blocked
122
  // while a new buffer is created/reused for them.
123
  // Returns whether that push reached the end of a buffer; useful if caller
124
  // wants to trigger processing regularly at the most efficient time.
125
  template<typename F>
126
  DidReachEndOfBuffer PushF(F&& aF)
127
0
  {
128
0
    // Atomically claim ownership of the next available element.
129
0
    const Index index{ mNextElementToWrite++ };
130
0
    // And now go and set that element.
131
0
    for (;;) {
132
0
      Index lastIndex{ mBuffersCoverAtLeastUpTo };
133
0
134
0
      if (MOZ_UNLIKELY(index == lastIndex)) {
135
0
        // We have claimed the last element in the current head -> Allocate a
136
0
        // new head in advance of more pushes. Make it point at the current
137
0
        // most-recent buffer.
138
0
        // This whole process is effectively guarded:
139
0
        // - Later pushes will wait until mBuffersCoverAtLeastUpTo changes to
140
0
        //   one that can accept their claimed index.
141
0
        // - Readers will stop until the last element is marked as valid.
142
0
        Buffer* ourBuffer = mMostRecentBuffer;
143
0
        Buffer* newBuffer = NewBuffer(ourBuffer, index + 1);
144
0
        // Because we have claimed this very specific index, we should be the
145
0
        // only one touching the most-recent buffer pointer.
146
0
        MOZ_ASSERT(mMostRecentBuffer == ourBuffer);
147
0
        // Just pivot the most-recent buffer pointer to our new buffer.
148
0
        mMostRecentBuffer = newBuffer;
149
0
        // Because we have claimed this very specific index, we should be the
150
0
        // only one touching the buffer coverage watermark.
151
0
        MOZ_ASSERT(mBuffersCoverAtLeastUpTo == lastIndex.Value());
152
0
        // Update it to include the just-added most-recent buffer.
153
0
        mBuffersCoverAtLeastUpTo = index.Value() + BufferSize;
154
0
        // We know for sure that `ourBuffer` is the correct one for this index.
155
0
        ourBuffer->SetAndValidateElement(aF, index);
156
0
        // And indicate that we have reached the end of a buffer.
157
0
        return true;
158
0
      }
159
0
160
0
      if (MOZ_UNLIKELY(index > lastIndex)) {
161
0
        // We have claimed an element in a yet-unavailable buffer, wait for our
162
0
        // target buffer to be created (see above).
163
0
        while (Index(mBuffersCoverAtLeastUpTo) < index) {
164
0
          PR_Sleep(PR_INTERVAL_NO_WAIT); // Yield
165
0
        }
166
0
        // Then loop to examine the new situation.
167
0
        continue;
168
0
      }
169
0
170
0
      // Here, we have claimed a number that is covered by current buffers.
171
0
      // These buffers cannot be destroyed, because our buffer is not filled
172
0
      // yet (we haven't written in it yet), therefore the reader thread will
173
0
      // have to stop there (or before) and won't destroy our buffer or more
174
0
      // recent ones.
175
0
      MOZ_ASSERT(index < lastIndex);
176
0
      Buffer* ourBuffer = mMostRecentBuffer;
177
0
178
0
      // In rare situations, another thread may have had the time to create a
179
0
      // new more-recent buffer, in which case we need to find our older buffer.
180
0
      while (MOZ_UNLIKELY(index < ourBuffer->Origin())) {
181
0
        // We assume that older buffers with still-invalid elements (e.g., the
182
0
        // one we have just claimed) cannot be destroyed.
183
0
        MOZ_ASSERT(ourBuffer->Older());
184
0
        ourBuffer = ourBuffer->Older();
185
0
      }
186
0
187
0
      // Now we can set&validate the claimed element, and indicate that we have
188
0
      // not reached the end of a buffer.
189
0
      ourBuffer->SetAndValidateElement(aF, index);
190
0
      return false;
191
0
    }
192
0
  }
Unexecuted instantiation: bool mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::PushF<mozilla::DDMediaLogs::Log(char const*, void const*, mozilla::DDLogCategory, char const*, mozilla::Variant<mozilla::DDNoValue, mozilla::DDLogObject, char const*, nsTString<char> const, bool, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, double, mozilla::DDRange, nsresult, mozilla::MediaResult>&&)::{lambda(mozilla::DDLogMessage&, mozilla::RollingNumber<unsigned int>)#1}>(mozilla::DDMediaLogs::Log(char const*, void const*, mozilla::DDLogCategory, char const*, mozilla::Variant<mozilla::DDNoValue, mozilla::DDLogObject, char const*, nsTString<char> const, bool, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, double, mozilla::DDRange, nsresult, mozilla::MediaResult>&&)::{lambda(mozilla::DDLogMessage&, mozilla::RollingNumber<unsigned int>)#1}&&)
Unexecuted instantiation: bool mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::PushF<mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}>(mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&&)
Unexecuted instantiation: bool mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::PushF<mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}>(mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&&)
Unexecuted instantiation: bool mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::PushF<mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}>(mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&&)
Unexecuted instantiation: bool mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::PushF<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}>(mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&&)
Unexecuted instantiation: bool mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::PushF<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}>(mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&&)
Unexecuted instantiation: bool mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::PushF<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}>(mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&&)
Unexecuted instantiation: bool mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::PushF<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}>(mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&&)
Unexecuted instantiation: bool mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::PushF<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}>(mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&&)
Unexecuted instantiation: bool mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::PushF<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}>(mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&&)
193
194
  // Push new element and assign it a value.
195
  // Atomically thread-safe; in the worst case some pushes may be blocked
196
  // while a new buffer is created/reused for them.
197
  // Returns whether that push reached the end of a buffer; useful if caller
198
  // wants to trigger processing regularly at the most efficient time.
199
  DidReachEndOfBuffer Push(const T& aT)
200
0
  {
201
0
    return PushF([&aT](T& aElement, Index) { aElement = aT; });
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}::operator()(int&, mozilla::RollingNumber<unsigned int>) const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}::operator()(int&, mozilla::RollingNumber<unsigned int>) const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}::operator()(int&, mozilla::RollingNumber<unsigned int>) const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}::operator()(int&, mozilla::RollingNumber<unsigned int>) const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}::operator()(int&, mozilla::RollingNumber<unsigned int>) const
202
0
  }
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)
203
204
  // Push new element and move-assign it a value.
205
  // Atomically thread-safe; in the worst case some pushes may be blocked
206
  // while a new buffer is created/reused for them.
207
  // Returns whether that push reached the end of a buffer; useful if caller
208
  // wants to trigger processing regularly at the most efficient time.
209
  DidReachEndOfBuffer Push(T&& aT)
210
0
  {
211
0
    return PushF([&aT](T& aElement, Index) { aElement = std::move(aT); });
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}::operator()(int&, mozilla::RollingNumber<unsigned int>) const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}::operator()(int&, mozilla::RollingNumber<unsigned int>) const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}::operator()(int&, mozilla::RollingNumber<unsigned int>) const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}::operator()(int&, mozilla::RollingNumber<unsigned int>) const
212
0
  }
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Push(int&&)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Push(int&&)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int&&)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int&&)
213
214
  // Pop all elements before the first invalid one, running aF on each of them
215
  // in FIFO order.
216
  // Thread-safety with other PopAll calls is controlled by the `Locking`
217
  // template argument.
218
  // Concurrent pushes are always allowed, because:
219
  // - PopAll won't read elements until valid,
220
  // - Pushes do not interfere with pop-related members -- except for
221
  //   mReusableBuffers, which is accessed atomically.
222
  template<typename F>
223
  void PopAll(F&& aF)
224
0
  {
225
0
    mReaderLocking.Lock();
226
0
    // Destroy every second fully-read buffer.
227
0
    // TODO: Research a better algorithm, probably based on stats.
228
0
    bool destroy = false;
229
0
    for (;;) {
230
0
      Buffer* b = mOldestBuffer;
231
0
      MOZ_ASSERT(!b->Older());
232
0
      // The next element to pop must be in that oldest buffer.
233
0
      MOZ_ASSERT(mNextElementToPop >= b->Origin());
234
0
      MOZ_ASSERT(mNextElementToPop < b->Origin() + BufferSize);
235
0
236
0
      // Start reading each element.
237
0
      if (!b->ReadAndInvalidateAll(aF, mNextElementToPop)) {
238
0
        // Found an invalid element, stop popping.
239
0
        mReaderLocking.Unlock();
240
0
        return;
241
0
      }
242
0
243
0
      // Reached the end of this oldest buffer
244
0
      MOZ_ASSERT(mNextElementToPop == b->Origin() + BufferSize);
245
0
      // Delete this oldest buffer.
246
0
      // Since the last element was valid, it must mean that there is a newer
247
0
      // buffer.
248
0
      MOZ_ASSERT(b->Newer());
249
0
      MOZ_ASSERT(mNextElementToPop == b->Newer()->Origin());
250
0
      StopUsing(b, destroy);
251
0
      destroy = !destroy;
252
0
253
0
      // We will loop and start reading the now-oldest buffer.
254
0
    }
255
0
  }
Unexecuted instantiation: Unified_cpp_dom_media_doctor0.cpp:void mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::PopAll<mozilla::DDMediaLogs::Shutdown(bool)::$_1>(mozilla::DDMediaLogs::Shutdown(bool)::$_1&&)
Unexecuted instantiation: Unified_cpp_dom_media_doctor0.cpp:void mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::PopAll<mozilla::DDMediaLogs::ProcessBuffer()::$_3>(mozilla::DDMediaLogs::ProcessBuffer()::$_3&&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:void mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::PopAll<void TestMultiWriterQueueST<1ul>(int)::{lambda(int&)#1}>(void TestMultiWriterQueueST<1ul>(int)::{lambda(int&)#1}&&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:void mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::PopAll<void TestMultiWriterQueueST<1ul>(int)::{lambda(int&)#2}>(void TestMultiWriterQueueST<1ul>(int)::{lambda(int&)#2}&&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:void mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::PopAll<void TestMultiWriterQueueST<2ul>(int)::{lambda(int&)#1}>(void TestMultiWriterQueueST<2ul>(int)::{lambda(int&)#1}&&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:void mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::PopAll<void TestMultiWriterQueueST<2ul>(int)::{lambda(int&)#2}>(void TestMultiWriterQueueST<2ul>(int)::{lambda(int&)#2}&&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:void mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::PopAll<void TestMultiWriterQueueST<4ul>(int)::{lambda(int&)#1}>(void TestMultiWriterQueueST<4ul>(int)::{lambda(int&)#1}&&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:void mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::PopAll<void TestMultiWriterQueueST<4ul>(int)::{lambda(int&)#2}>(void TestMultiWriterQueueST<4ul>(int)::{lambda(int&)#2}&&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:void mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::PopAll<void TestMultiWriterQueueST<10ul>(int)::{lambda(int&)#1}>(void TestMultiWriterQueueST<10ul>(int)::{lambda(int&)#1}&&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:void mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::PopAll<void TestMultiWriterQueueST<10ul>(int)::{lambda(int&)#2}>(void TestMultiWriterQueueST<10ul>(int)::{lambda(int&)#2}&&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:void mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::PopAll<void TestMultiWriterQueueST<8192ul>(int)::{lambda(int&)#1}>(void TestMultiWriterQueueST<8192ul>(int)::{lambda(int&)#1}&&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:void mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::PopAll<void TestMultiWriterQueueST<8192ul>(int)::{lambda(int&)#2}>(void TestMultiWriterQueueST<8192ul>(int)::{lambda(int&)#2}&&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:void mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::PopAll<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda()#1}::operator()() const::{lambda(int const&)#1}>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda()#1}::operator()() const::{lambda(int const&)#1}&&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:void mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::PopAll<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda(int const&)#1}>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda(int const&)#1}&&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:void mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::PopAll<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda(int const&)#2}>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda(int const&)#2}&&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:void mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::PopAll<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda()#1}::operator()() const::{lambda(int const&)#1}>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda()#1}::operator()() const::{lambda(int const&)#1}&&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:void mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::PopAll<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda(int const&)#1}>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda(int const&)#1}&&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:void mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::PopAll<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda(int const&)#2}>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda(int const&)#2}&&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:void mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::PopAll<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda()#1}::operator()() const::{lambda(int const&)#1}>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda()#1}::operator()() const::{lambda(int const&)#1}&&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:void mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::PopAll<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda(int const&)#1}>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda(int const&)#1}&&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:void mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::PopAll<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda(int const&)#2}>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda(int const&)#2}&&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:void mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::PopAll<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda()#1}::operator()() const::{lambda(int const&)#1}>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda()#1}::operator()() const::{lambda(int const&)#1}&&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:void mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::PopAll<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda(int const&)#1}>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda(int const&)#1}&&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:void mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::PopAll<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda(int const&)#2}>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda(int const&)#2}&&)
256
257
  // Size of all buffers (used, or recyclable), excluding external data.
258
  size_t ShallowSizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
259
0
  {
260
0
    return mAllocatedBuffersStats.Count() * sizeof(Buffer);
261
0
  }
262
263
  struct CountAndWatermark
264
  {
265
    int mCount;
266
    int mWatermark;
267
  };
268
269
0
  CountAndWatermark LiveBuffersStats() const { return mLiveBuffersStats.Get(); }
Unexecuted instantiation: mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::LiveBuffersStats() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::LiveBuffersStats() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::LiveBuffersStats() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::LiveBuffersStats() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::LiveBuffersStats() const
270
  CountAndWatermark ReusableBuffersStats() const
271
0
  {
272
0
    return mReusableBuffersStats.Get();
273
0
  }
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::ReusableBuffersStats() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::ReusableBuffersStats() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::ReusableBuffersStats() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::ReusableBuffersStats() const
274
  CountAndWatermark AllocatedBuffersStats() const
275
0
  {
276
0
    return mAllocatedBuffersStats.Get();
277
0
  }
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::AllocatedBuffersStats() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::AllocatedBuffersStats() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::AllocatedBuffersStats() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::AllocatedBuffersStats() const
278
279
private:
280
  // Structure containing the element to be stored, and a validity-marker.
281
  class BufferedElement
282
  {
283
  public:
284
    // Run aF on an invalid element, and mark it as valid.
285
    template<typename F>
286
    void SetAndValidate(F&& aF, Index aIndex)
287
0
    {
288
0
      MOZ_ASSERT(!mValid);
289
0
      aF(mT, aIndex);
290
0
      mValid = true;
291
0
    }
Unexecuted instantiation: void mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::BufferedElement::SetAndValidate<mozilla::DDMediaLogs::Log(char const*, void const*, mozilla::DDLogCategory, char const*, mozilla::Variant<mozilla::DDNoValue, mozilla::DDLogObject, char const*, nsTString<char> const, bool, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, double, mozilla::DDRange, nsresult, mozilla::MediaResult>&&)::{lambda(mozilla::DDLogMessage&, mozilla::RollingNumber<unsigned int>)#1}&>(mozilla::DDMediaLogs::Log(char const*, void const*, mozilla::DDLogCategory, char const*, mozilla::Variant<mozilla::DDNoValue, mozilla::DDLogObject, char const*, nsTString<char> const, bool, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, double, mozilla::DDRange, nsresult, mozilla::MediaResult>&&)::{lambda(mozilla::DDLogMessage&, mozilla::RollingNumber<unsigned int>)#1}&, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: void mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::BufferedElement::SetAndValidate<mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&>(mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: void mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::BufferedElement::SetAndValidate<mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&>(mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: void mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::BufferedElement::SetAndValidate<mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&>(mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: void mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::BufferedElement::SetAndValidate<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&>(mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: void mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::BufferedElement::SetAndValidate<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&>(mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: void mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::BufferedElement::SetAndValidate<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&>(mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: void mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::BufferedElement::SetAndValidate<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&>(mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: void mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::BufferedElement::SetAndValidate<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&>(mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: void mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::BufferedElement::SetAndValidate<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&>(mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&, mozilla::RollingNumber<unsigned int>)
292
293
    // Run aF on a valid element and mark it as invalid, return true.
294
    // Return false if element was invalid.
295
    template<typename F>
296
    bool ReadAndInvalidate(F&& aF)
297
0
    {
298
0
      if (!mValid) {
299
0
        return false;
300
0
      }
301
0
      aF(mT);
302
0
      mValid = false;
303
0
      return true;
304
0
    }
Unexecuted instantiation: Unified_cpp_dom_media_doctor0.cpp:bool mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::BufferedElement::ReadAndInvalidate<mozilla::DDMediaLogs::Shutdown(bool)::$_1&>(mozilla::DDMediaLogs::Shutdown(bool)::$_1&)
Unexecuted instantiation: Unified_cpp_dom_media_doctor0.cpp:bool mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::BufferedElement::ReadAndInvalidate<mozilla::DDMediaLogs::ProcessBuffer()::$_3&>(mozilla::DDMediaLogs::ProcessBuffer()::$_3&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::BufferedElement::ReadAndInvalidate<void TestMultiWriterQueueST<1ul>(int)::{lambda(int&)#1}&>(void TestMultiWriterQueueST<1ul>(int)::{lambda(int&)#1}&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::BufferedElement::ReadAndInvalidate<void TestMultiWriterQueueST<1ul>(int)::{lambda(int&)#2}&>(void TestMultiWriterQueueST<1ul>(int)::{lambda(int&)#2}&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::BufferedElement::ReadAndInvalidate<void TestMultiWriterQueueST<2ul>(int)::{lambda(int&)#1}&>(void TestMultiWriterQueueST<2ul>(int)::{lambda(int&)#1}&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::BufferedElement::ReadAndInvalidate<void TestMultiWriterQueueST<2ul>(int)::{lambda(int&)#2}&>(void TestMultiWriterQueueST<2ul>(int)::{lambda(int&)#2}&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::BufferedElement::ReadAndInvalidate<void TestMultiWriterQueueST<4ul>(int)::{lambda(int&)#1}&>(void TestMultiWriterQueueST<4ul>(int)::{lambda(int&)#1}&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::BufferedElement::ReadAndInvalidate<void TestMultiWriterQueueST<4ul>(int)::{lambda(int&)#2}&>(void TestMultiWriterQueueST<4ul>(int)::{lambda(int&)#2}&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::BufferedElement::ReadAndInvalidate<void TestMultiWriterQueueST<10ul>(int)::{lambda(int&)#1}&>(void TestMultiWriterQueueST<10ul>(int)::{lambda(int&)#1}&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::BufferedElement::ReadAndInvalidate<void TestMultiWriterQueueST<10ul>(int)::{lambda(int&)#2}&>(void TestMultiWriterQueueST<10ul>(int)::{lambda(int&)#2}&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::BufferedElement::ReadAndInvalidate<void TestMultiWriterQueueST<8192ul>(int)::{lambda(int&)#1}&>(void TestMultiWriterQueueST<8192ul>(int)::{lambda(int&)#1}&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::BufferedElement::ReadAndInvalidate<void TestMultiWriterQueueST<8192ul>(int)::{lambda(int&)#2}&>(void TestMultiWriterQueueST<8192ul>(int)::{lambda(int&)#2}&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::BufferedElement::ReadAndInvalidate<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda()#1}::operator()() const::{lambda(int const&)#1}&>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda()#1}::operator()() const::{lambda(int const&)#1}&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::BufferedElement::ReadAndInvalidate<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda(int const&)#1}&>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda(int const&)#1}&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::BufferedElement::ReadAndInvalidate<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda(int const&)#2}&>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda(int const&)#2}&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::BufferedElement::ReadAndInvalidate<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda()#1}::operator()() const::{lambda(int const&)#1}&>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda()#1}::operator()() const::{lambda(int const&)#1}&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::BufferedElement::ReadAndInvalidate<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda(int const&)#1}&>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda(int const&)#1}&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::BufferedElement::ReadAndInvalidate<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda(int const&)#2}&>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda(int const&)#2}&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::BufferedElement::ReadAndInvalidate<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda()#1}::operator()() const::{lambda(int const&)#1}&>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda()#1}::operator()() const::{lambda(int const&)#1}&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::BufferedElement::ReadAndInvalidate<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda(int const&)#1}&>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda(int const&)#1}&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::BufferedElement::ReadAndInvalidate<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda(int const&)#2}&>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda(int const&)#2}&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::BufferedElement::ReadAndInvalidate<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda()#1}::operator()() const::{lambda(int const&)#1}&>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda()#1}::operator()() const::{lambda(int const&)#1}&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::BufferedElement::ReadAndInvalidate<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda(int const&)#1}&>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda(int const&)#1}&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::BufferedElement::ReadAndInvalidate<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda(int const&)#2}&>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda(int const&)#2}&)
305
306
  private:
307
    T mT;
308
    // mValid should be atomically changed to true *after* mT has been written,
309
    // so that the reader can only see valid data.
310
    // ReleaseAcquire, because when set to `true`, we want the just-written mT
311
    // to be visible to the thread reading this `true`; and when set to `false`,
312
    // we want the previous reads to have completed.
313
    Atomic<bool, ReleaseAcquire> mValid{ false };
314
  };
315
316
  // Buffer contains a sequence of BufferedElements starting at a specific
317
  // index, and it points to the next-older buffer (if any).
318
  class Buffer
319
  {
320
  public:
321
    // Constructor of the very first buffer.
322
    Buffer()
323
      : mOlder(nullptr)
324
      , mNewer(nullptr)
325
      , mOrigin(0)
326
0
    {
327
0
    }
Unexecuted instantiation: mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::Buffer()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Buffer()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Buffer()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Buffer()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Buffer()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Buffer()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::Buffer()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::Buffer()
328
329
    // Constructor of later buffers.
330
    Buffer(Buffer* aOlder, Index aOrigin)
331
      : mOlder(aOlder)
332
      , mNewer(nullptr)
333
      , mOrigin(aOrigin)
334
0
    {
335
0
      MOZ_ASSERT(aOlder);
336
0
      aOlder->mNewer = this;
337
0
    }
Unexecuted instantiation: mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::Buffer(mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer*, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Buffer(mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Buffer(mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Buffer(mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Buffer(mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Buffer(mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::Buffer(mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer*, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::Buffer(mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer*, mozilla::RollingNumber<unsigned int>)
338
339
0
    Buffer* Older() const { return mOlder; }
Unexecuted instantiation: mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::Older() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Older() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Older() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Older() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Older() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Older() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::Older() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::Older() const
340
0
    void SetOlder(Buffer* aOlder) { mOlder = aOlder; }
Unexecuted instantiation: mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::SetOlder(mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer*)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::SetOlder(mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::SetOlder(mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::SetOlder(mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::SetOlder(mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::SetOlder(mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::SetOlder(mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer*)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::SetOlder(mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer*)
341
342
0
    Buffer* Newer() const { return mNewer; }
Unexecuted instantiation: mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::Newer() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Newer() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Newer() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Newer() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Newer() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Newer() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::Newer() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::Newer() const
343
0
    void SetNewer(Buffer* aNewer) { mNewer = aNewer; }
Unexecuted instantiation: mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::SetNewer(mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer*)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::SetNewer(mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::SetNewer(mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::SetNewer(mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::SetNewer(mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::SetNewer(mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::SetNewer(mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer*)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::SetNewer(mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer*)
344
345
0
    Index Origin() const { return mOrigin; }
Unexecuted instantiation: mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::Origin() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Origin() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Origin() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Origin() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Origin() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::Origin() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::Origin() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::Origin() const
346
0
    void SetOrigin(Index aOrigin) { mOrigin = aOrigin; }
Unexecuted instantiation: mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::SetOrigin(mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::SetOrigin(mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::SetOrigin(mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::SetOrigin(mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::SetOrigin(mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::SetOrigin(mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::SetOrigin(mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::SetOrigin(mozilla::RollingNumber<unsigned int>)
347
348
    // Run aF on a yet-invalid element.
349
    // Not thread-safe by itself, but nothing else should write this element,
350
    // and reader won't access it until after it becomes valid.
351
    template<typename F>
352
    void SetAndValidateElement(F&& aF, Index aIndex)
353
0
    {
354
0
      MOZ_ASSERT(aIndex >= Origin());
355
0
      MOZ_ASSERT(aIndex < Origin() + BufferSize);
356
0
      mElements[aIndex - Origin()].SetAndValidate(aF, aIndex);
357
0
    }
Unexecuted instantiation: void mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::SetAndValidateElement<mozilla::DDMediaLogs::Log(char const*, void const*, mozilla::DDLogCategory, char const*, mozilla::Variant<mozilla::DDNoValue, mozilla::DDLogObject, char const*, nsTString<char> const, bool, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, double, mozilla::DDRange, nsresult, mozilla::MediaResult>&&)::{lambda(mozilla::DDLogMessage&, mozilla::RollingNumber<unsigned int>)#1}&>(mozilla::DDMediaLogs::Log(char const*, void const*, mozilla::DDLogCategory, char const*, mozilla::Variant<mozilla::DDNoValue, mozilla::DDLogObject, char const*, nsTString<char> const, bool, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, double, mozilla::DDRange, nsresult, mozilla::MediaResult>&&)::{lambda(mozilla::DDLogMessage&, mozilla::RollingNumber<unsigned int>)#1}&, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: void mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::SetAndValidateElement<mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&>(mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: void mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::SetAndValidateElement<mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&>(mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: void mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::SetAndValidateElement<mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&>(mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: void mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::SetAndValidateElement<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&>(mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: void mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::SetAndValidateElement<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&>(mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int const&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: void mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::SetAndValidateElement<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&>(mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: void mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::SetAndValidateElement<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&>(mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: void mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::SetAndValidateElement<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&>(mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: void mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::SetAndValidateElement<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&>(mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Push(int&&)::{lambda(int&, mozilla::RollingNumber<unsigned int>)#1}&, mozilla::RollingNumber<unsigned int>)
358
359
    using DidReadLastElement = bool;
360
361
    // Read all valid elements starting at aIndex, marking them invalid and
362
    // updating aIndex.
363
    // Returns true if we ended up reading the last element in this buffer.
364
    // Accessing the validity bit is thread-safe (as it's atomic), but once
365
    // an element is valid, the reading itself is not thread-safe and should be
366
    // guarded.
367
    template<typename F>
368
    DidReadLastElement ReadAndInvalidateAll(F&& aF, Index& aIndex)
369
0
    {
370
0
      MOZ_ASSERT(aIndex >= Origin());
371
0
      MOZ_ASSERT(aIndex < Origin() + BufferSize);
372
0
      for (; aIndex < Origin() + BufferSize; ++aIndex) {
373
0
        if (!mElements[aIndex - Origin()].ReadAndInvalidate(aF)) {
374
0
          // Found an invalid element, stop here. (aIndex will not be updated
375
0
          // past it, so we will start from here next time.)
376
0
          return false;
377
0
        }
378
0
      }
379
0
      return true;
380
0
    }
Unexecuted instantiation: Unified_cpp_dom_media_doctor0.cpp:bool mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::ReadAndInvalidateAll<mozilla::DDMediaLogs::Shutdown(bool)::$_1&>(mozilla::DDMediaLogs::Shutdown(bool)::$_1&, mozilla::RollingNumber<unsigned int>&)
Unexecuted instantiation: Unified_cpp_dom_media_doctor0.cpp:bool mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::ReadAndInvalidateAll<mozilla::DDMediaLogs::ProcessBuffer()::$_3&>(mozilla::DDMediaLogs::ProcessBuffer()::$_3&, mozilla::RollingNumber<unsigned int>&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::ReadAndInvalidateAll<void TestMultiWriterQueueST<1ul>(int)::{lambda(int&)#1}&>(void TestMultiWriterQueueST<1ul>(int)::{lambda(int&)#1}&, mozilla::RollingNumber<unsigned int>&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::ReadAndInvalidateAll<void TestMultiWriterQueueST<1ul>(int)::{lambda(int&)#2}&>(void TestMultiWriterQueueST<1ul>(int)::{lambda(int&)#2}&, mozilla::RollingNumber<unsigned int>&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::ReadAndInvalidateAll<void TestMultiWriterQueueST<2ul>(int)::{lambda(int&)#1}&>(void TestMultiWriterQueueST<2ul>(int)::{lambda(int&)#1}&, mozilla::RollingNumber<unsigned int>&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::ReadAndInvalidateAll<void TestMultiWriterQueueST<2ul>(int)::{lambda(int&)#2}&>(void TestMultiWriterQueueST<2ul>(int)::{lambda(int&)#2}&, mozilla::RollingNumber<unsigned int>&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::ReadAndInvalidateAll<void TestMultiWriterQueueST<4ul>(int)::{lambda(int&)#1}&>(void TestMultiWriterQueueST<4ul>(int)::{lambda(int&)#1}&, mozilla::RollingNumber<unsigned int>&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::ReadAndInvalidateAll<void TestMultiWriterQueueST<4ul>(int)::{lambda(int&)#2}&>(void TestMultiWriterQueueST<4ul>(int)::{lambda(int&)#2}&, mozilla::RollingNumber<unsigned int>&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::ReadAndInvalidateAll<void TestMultiWriterQueueST<10ul>(int)::{lambda(int&)#1}&>(void TestMultiWriterQueueST<10ul>(int)::{lambda(int&)#1}&, mozilla::RollingNumber<unsigned int>&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::ReadAndInvalidateAll<void TestMultiWriterQueueST<10ul>(int)::{lambda(int&)#2}&>(void TestMultiWriterQueueST<10ul>(int)::{lambda(int&)#2}&, mozilla::RollingNumber<unsigned int>&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::ReadAndInvalidateAll<void TestMultiWriterQueueST<8192ul>(int)::{lambda(int&)#1}&>(void TestMultiWriterQueueST<8192ul>(int)::{lambda(int&)#1}&, mozilla::RollingNumber<unsigned int>&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::ReadAndInvalidateAll<void TestMultiWriterQueueST<8192ul>(int)::{lambda(int&)#2}&>(void TestMultiWriterQueueST<8192ul>(int)::{lambda(int&)#2}&, mozilla::RollingNumber<unsigned int>&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::ReadAndInvalidateAll<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda()#1}::operator()() const::{lambda(int const&)#1}&>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda()#1}::operator()() const::{lambda(int const&)#1}&, mozilla::RollingNumber<unsigned int>&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::ReadAndInvalidateAll<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda(int const&)#1}&>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda(int const&)#1}&, mozilla::RollingNumber<unsigned int>&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::ReadAndInvalidateAll<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda(int const&)#2}&>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda(int const&)#2}&, mozilla::RollingNumber<unsigned int>&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::ReadAndInvalidateAll<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda()#1}::operator()() const::{lambda(int const&)#1}&>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda()#1}::operator()() const::{lambda(int const&)#1}&, mozilla::RollingNumber<unsigned int>&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::ReadAndInvalidateAll<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda(int const&)#1}&>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda(int const&)#1}&, mozilla::RollingNumber<unsigned int>&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer::ReadAndInvalidateAll<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda(int const&)#2}&>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None> >(int, int, int, char const*)::{lambda(int const&)#2}&, mozilla::RollingNumber<unsigned int>&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::ReadAndInvalidateAll<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda()#1}::operator()() const::{lambda(int const&)#1}&>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda()#1}::operator()() const::{lambda(int const&)#1}&, mozilla::RollingNumber<unsigned int>&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::ReadAndInvalidateAll<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda(int const&)#1}&>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda(int const&)#1}&, mozilla::RollingNumber<unsigned int>&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::ReadAndInvalidateAll<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda(int const&)#2}&>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda(int const&)#2}&, mozilla::RollingNumber<unsigned int>&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::ReadAndInvalidateAll<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda()#1}::operator()() const::{lambda(int const&)#1}&>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda()#1}::operator()() const::{lambda(int const&)#1}&, mozilla::RollingNumber<unsigned int>&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::ReadAndInvalidateAll<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda(int const&)#1}&>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda(int const&)#1}&, mozilla::RollingNumber<unsigned int>&)
Unexecuted instantiation: Unified_cpp_media_doctor_gtest0.cpp:bool mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer::ReadAndInvalidateAll<void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda(int const&)#2}&>(void TestMultiWriterQueueMT<mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex> >(int, int, int, char const*)::{lambda(int const&)#2}&, mozilla::RollingNumber<unsigned int>&)
381
382
  private:
383
    Buffer* mOlder;
384
    Buffer* mNewer;
385
    Index mOrigin;
386
    BufferedElement mElements[BufferSize];
387
  };
388
389
  // Reuse a buffer, or create a new one.
390
  // All buffered elements will be invalid.
391
  Buffer* NewBuffer(Buffer* aOlder, Index aOrigin)
392
0
  {
393
0
    MOZ_ASSERT(aOlder);
394
0
    for (;;) {
395
0
      Buffer* head = mReusableBuffers;
396
0
      if (!head) {
397
0
        ++mAllocatedBuffersStats;
398
0
        ++mLiveBuffersStats;
399
0
        Buffer* buffer = new Buffer(aOlder, aOrigin);
400
0
        return buffer;
401
0
      }
402
0
      Buffer* older = head->Older();
403
0
      // Try to pivot the reusable-buffer pointer from the current head to the
404
0
      // next buffer in line.
405
0
      if (mReusableBuffers.compareExchange(head, older)) {
406
0
        // Success! The reusable-buffer pointer now points at the older buffer,
407
0
        // so we can recycle this ex-head.
408
0
        --mReusableBuffersStats;
409
0
        ++mLiveBuffersStats;
410
0
        head->SetOlder(aOlder);
411
0
        aOlder->SetNewer(head);
412
0
        // We will be the newest; newer-pointer should already be null.
413
0
        MOZ_ASSERT(!head->Newer());
414
0
        head->SetOrigin(aOrigin);
415
0
        return head;
416
0
      }
417
0
      // Failure, someone else must have touched the list, loop to try again.
418
0
    }
419
0
  }
Unexecuted instantiation: mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::NewBuffer(mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer*, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::NewBuffer(mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::NewBuffer(mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::NewBuffer(mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::NewBuffer(mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::NewBuffer(mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::NewBuffer(mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer*, mozilla::RollingNumber<unsigned int>)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::NewBuffer(mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer*, mozilla::RollingNumber<unsigned int>)
420
421
  // Discard a fully-read buffer.
422
  // If aDestroy is true, delete it.
423
  // If aDestroy is false, move the buffer to a reusable-buffer stack.
424
  void StopUsing(Buffer* aBuffer, bool aDestroy)
425
0
  {
426
0
    --mLiveBuffersStats;
427
0
428
0
    // We should only stop using the oldest buffer.
429
0
    MOZ_ASSERT(!aBuffer->Older());
430
0
    // The newest buffer should not be modified here.
431
0
    MOZ_ASSERT(aBuffer->Newer());
432
0
    MOZ_ASSERT(aBuffer->Newer()->Older() == aBuffer);
433
0
    // Detach from the second-oldest buffer.
434
0
    aBuffer->Newer()->SetOlder(nullptr);
435
0
    // Make the second-oldest buffer the now-oldest buffer.
436
0
    mOldestBuffer = aBuffer->Newer();
437
0
438
0
    if (aDestroy) {
439
0
      --mAllocatedBuffersStats;
440
0
      delete aBuffer;
441
0
    } else {
442
0
      ++mReusableBuffersStats;
443
0
      // The recycling stack only uses mOlder; mNewer is not needed.
444
0
      aBuffer->SetNewer(nullptr);
445
0
446
0
      // Make the given buffer the new head of reusable buffers.
447
0
      for (;;) {
448
0
        Buffer* head = mReusableBuffers;
449
0
        aBuffer->SetOlder(head);
450
0
        if (mReusableBuffers.compareExchange(head, aBuffer)) {
451
0
          break;
452
0
        }
453
0
      }
454
0
    }
455
0
  }
Unexecuted instantiation: mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::StopUsing(mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer*, bool)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::StopUsing(mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*, bool)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::StopUsing(mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*, bool)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::StopUsing(mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*, bool)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::StopUsing(mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*, bool)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::StopUsing(mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::Buffer*, bool)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::StopUsing(mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer*, bool)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::StopUsing(mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::Buffer*, bool)
456
457
  // Index of the next element to write. Modified when an element index is
458
  // claimed for a push. If the last element of a buffer is claimed, that push
459
  // will be responsible for adding a new head buffer.
460
  // Relaxed, because there is no synchronization based on this variable, each
461
  // thread just needs to get a different value, and will then write different
462
  // things (which themselves have some atomic validation before they may be
463
  // read elsewhere, independent of this `mNextElementToWrite`.)
464
  Atomic<Index::ValueType, Relaxed> mNextElementToWrite{ 0 };
465
466
  // Index that a live recent buffer reaches. If a push claims a lesser-or-
467
  // equal number, the corresponding buffer is guaranteed to still be alive:
468
  // - It will have been created before this index was updated,
469
  // - It will not be destroyed until all its values have been written,
470
  //   including the one that just claimed a position within it.
471
  // Also, the push that claims this exact number is responsible for adding the
472
  // next buffer and updating this value accordingly.
473
  // ReleaseAcquire, because when set to a certain value, the just-created
474
  // buffer covering the new range must be visible to readers.
475
  Atomic<Index::ValueType, ReleaseAcquire> mBuffersCoverAtLeastUpTo;
476
477
  // Pointer to the most recent buffer. Never null.
478
  // This is the most recent of a deque of yet-unread buffers.
479
  // Only modified when adding a new head buffer.
480
  // ReleaseAcquire, because when modified, the just-created new buffer must be
481
  // visible to readers.
482
  Atomic<Buffer*, ReleaseAcquire> mMostRecentBuffer;
483
484
  // Stack of reusable buffers.
485
  // ReleaseAcquire, because when modified, the just-added buffer must be
486
  // visible to readers.
487
  Atomic<Buffer*, ReleaseAcquire> mReusableBuffers;
488
489
  // Template-provided locking mechanism to protect PopAll()-only member
490
  // variables below.
491
  ReaderLocking mReaderLocking;
492
493
  // Pointer to the oldest buffer, which contains the new element to be popped.
494
  // Never null.
495
  Buffer* mOldestBuffer;
496
497
  // Index of the next element to be popped.
498
  Index mNextElementToPop{ 0 };
499
500
  // Stats.
501
  class AtomicCountAndWatermark
502
  {
503
  public:
504
    explicit AtomicCountAndWatermark(int aCount)
505
      : mCount(aCount)
506
      , mWatermark(aCount)
507
0
    {
508
0
    }
Unexecuted instantiation: mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::AtomicCountAndWatermark::AtomicCountAndWatermark(int)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::AtomicCountAndWatermark::AtomicCountAndWatermark(int)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::AtomicCountAndWatermark::AtomicCountAndWatermark(int)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::AtomicCountAndWatermark::AtomicCountAndWatermark(int)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::AtomicCountAndWatermark::AtomicCountAndWatermark(int)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::AtomicCountAndWatermark::AtomicCountAndWatermark(int)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::AtomicCountAndWatermark::AtomicCountAndWatermark(int)
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::AtomicCountAndWatermark::AtomicCountAndWatermark(int)
509
510
0
    int Count() const { return int(mCount); }
511
512
    CountAndWatermark Get() const
513
0
    {
514
0
      return CountAndWatermark{ int(mCount), int(mWatermark) };
515
0
    }
Unexecuted instantiation: mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::AtomicCountAndWatermark::Get() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::AtomicCountAndWatermark::Get() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::AtomicCountAndWatermark::Get() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::AtomicCountAndWatermark::Get() const
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::AtomicCountAndWatermark::Get() const
516
517
    int operator++()
518
0
    {
519
0
      int count = int(++mCount);
520
0
      // Update watermark.
521
0
      for (;;) {
522
0
        int watermark = int(mWatermark);
523
0
        if (watermark >= count) {
524
0
          // printf("++[%p] -=> %d-%d\n", this, count, watermark);
525
0
          break;
526
0
        }
527
0
        if (mWatermark.compareExchange(watermark, count)) {
528
0
          // printf("++[%p] -x> %d-(was %d now %d)\n", this, count, watermark, count);
529
0
          break;
530
0
        }
531
0
      }
532
0
      return count;
533
0
    }
Unexecuted instantiation: mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::AtomicCountAndWatermark::operator++()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::AtomicCountAndWatermark::operator++()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::AtomicCountAndWatermark::operator++()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::AtomicCountAndWatermark::operator++()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::AtomicCountAndWatermark::operator++()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::AtomicCountAndWatermark::operator++()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::AtomicCountAndWatermark::operator++()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::AtomicCountAndWatermark::operator++()
534
535
    int operator--()
536
0
    {
537
0
      int count = int(--mCount);
538
0
      // printf("--[%p] -> %d\n", this, count);
539
0
      return count;
540
0
    }
Unexecuted instantiation: mozilla::MultiWriterQueue<mozilla::DDLogMessage, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::AtomicCountAndWatermark::operator--()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 1u, mozilla::MultiWriterQueueReaderLocking_Mutex>::AtomicCountAndWatermark::operator--()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 2u, mozilla::MultiWriterQueueReaderLocking_Mutex>::AtomicCountAndWatermark::operator--()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 4u, mozilla::MultiWriterQueueReaderLocking_Mutex>::AtomicCountAndWatermark::operator--()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_Mutex>::AtomicCountAndWatermark::operator--()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_Mutex>::AtomicCountAndWatermark::operator--()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 10u, mozilla::MultiWriterQueueReaderLocking_None>::AtomicCountAndWatermark::operator--()
Unexecuted instantiation: mozilla::MultiWriterQueue<int, 8192u, mozilla::MultiWriterQueueReaderLocking_None>::AtomicCountAndWatermark::operator--()
541
542
  private:
543
    // Relaxed, as these are just gathering stats, so consistency is not
544
    // critical.
545
    Atomic<int, Relaxed> mCount;
546
    Atomic<int, Relaxed> mWatermark;
547
  };
548
  // All buffers in the mMostRecentBuffer deque.
549
  AtomicCountAndWatermark mLiveBuffersStats;
550
  // All buffers in the mReusableBuffers stack.
551
  AtomicCountAndWatermark mReusableBuffersStats;
552
  // All allocated buffers (sum of above).
553
  AtomicCountAndWatermark mAllocatedBuffersStats;
554
};
555
556
} // namespace mozilla
557
558
#endif // mozilla_MultiWriterQueue_h_