/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_ |