@@ -103,7 +103,7 @@ template< typename T > class circular_queue
103
103
m_bufSize = cap + 1 ;
104
104
std::atomic_thread_fence (std::memory_order_release);
105
105
m_inPos.store (available, std::memory_order_relaxed);
106
- m_outPos.store (0 , std::memory_order_relaxed );
106
+ m_outPos.store (0 , std::memory_order_release );
107
107
return true ;
108
108
}
109
109
@@ -142,7 +142,7 @@ template< typename T > class circular_queue
142
142
*/
143
143
T peek () const
144
144
{
145
- const auto outPos = m_outPos.load (std::memory_order_relaxed );
145
+ const auto outPos = m_outPos.load (std::memory_order_acquire );
146
146
const auto inPos = m_inPos.load (std::memory_order_relaxed);
147
147
std::atomic_thread_fence (std::memory_order_acquire);
148
148
if (inPos == outPos) return defaultValue;
@@ -156,7 +156,7 @@ template< typename T > class circular_queue
156
156
*/
157
157
bool IRAM_ATTR push (T&& val)
158
158
{
159
- const auto inPos = m_inPos.load (std::memory_order_relaxed );
159
+ const auto inPos = m_inPos.load (std::memory_order_acquire );
160
160
const unsigned next = (inPos + 1 ) % m_bufSize;
161
161
if (next == m_outPos.load (std::memory_order_relaxed)) {
162
162
return false ;
@@ -168,7 +168,7 @@ template< typename T > class circular_queue
168
168
169
169
std::atomic_thread_fence (std::memory_order_release);
170
170
171
- m_inPos.store (next, std::memory_order_relaxed );
171
+ m_inPos.store (next, std::memory_order_release );
172
172
return true ;
173
173
}
174
174
@@ -190,7 +190,7 @@ template< typename T > class circular_queue
190
190
*/
191
191
size_t push_n (const T* buffer, size_t size)
192
192
{
193
- const auto inPos = m_inPos.load (std::memory_order_relaxed );
193
+ const auto inPos = m_inPos.load (std::memory_order_acquire );
194
194
const auto outPos = m_outPos.load (std::memory_order_relaxed);
195
195
196
196
size_t blockSize = (outPos > inPos) ? outPos - 1 - inPos : (outPos == 0 ) ? m_bufSize - 1 - inPos : m_bufSize - inPos;
@@ -209,7 +209,7 @@ template< typename T > class circular_queue
209
209
210
210
std::atomic_thread_fence (std::memory_order_release);
211
211
212
- m_inPos.store (next, std::memory_order_relaxed );
212
+ m_inPos.store (next, std::memory_order_release );
213
213
return blockSize + size;
214
214
}
215
215
@@ -220,7 +220,7 @@ template< typename T > class circular_queue
220
220
*/
221
221
T pop ()
222
222
{
223
- const auto outPos = m_outPos.load (std::memory_order_relaxed );
223
+ const auto outPos = m_outPos.load (std::memory_order_acquire );
224
224
if (m_inPos.load (std::memory_order_relaxed) == outPos) return defaultValue;
225
225
226
226
std::atomic_thread_fence (std::memory_order_acquire);
@@ -229,7 +229,7 @@ template< typename T > class circular_queue
229
229
230
230
std::atomic_thread_fence (std::memory_order_release);
231
231
232
- m_outPos.store ((outPos + 1 ) % m_bufSize, std::memory_order_relaxed );
232
+ m_outPos.store ((outPos + 1 ) % m_bufSize, std::memory_order_release );
233
233
return val;
234
234
}
235
235
@@ -241,7 +241,7 @@ template< typename T > class circular_queue
241
241
size_t pop_n (T* buffer, size_t size) {
242
242
size_t avail = size = std::min (size, available ());
243
243
if (!avail) return 0 ;
244
- const auto outPos = m_outPos.load (std::memory_order_relaxed );
244
+ const auto outPos = m_outPos.load (std::memory_order_acquire );
245
245
size_t n = std::min (avail, static_cast <size_t >(m_bufSize - outPos));
246
246
247
247
std::atomic_thread_fence (std::memory_order_acquire);
@@ -252,7 +252,7 @@ template< typename T > class circular_queue
252
252
253
253
std::atomic_thread_fence (std::memory_order_release);
254
254
255
- m_outPos.store ((outPos + size) % m_bufSize, std::memory_order_relaxed );
255
+ m_outPos.store ((outPos + size) % m_bufSize, std::memory_order_release );
256
256
return size;
257
257
}
258
258
@@ -262,15 +262,15 @@ template< typename T > class circular_queue
262
262
*/
263
263
void for_each (std::function<void (T&&)> fun)
264
264
{
265
- auto outPos = m_outPos.load (std::memory_order_relaxed );
265
+ auto outPos = m_outPos.load (std::memory_order_acquire );
266
266
const auto inPos = m_inPos.load (std::memory_order_relaxed);
267
267
std::atomic_thread_fence (std::memory_order_acquire);
268
268
while (outPos != inPos)
269
269
{
270
270
fun (std::move (m_buffer[outPos]));
271
271
std::atomic_thread_fence (std::memory_order_release);
272
272
outPos = (outPos + 1 ) % m_bufSize;
273
- m_outPos.store (outPos, std::memory_order_relaxed );
273
+ m_outPos.store (outPos, std::memory_order_release );
274
274
}
275
275
}
276
276
@@ -379,16 +379,15 @@ template< typename T > class circular_queue_mp : protected circular_queue<T>
379
379
#else
380
380
std::lock_guard<std::mutex> lock (m_pushMtx);
381
381
#endif
382
- std::atomic_thread_fence (std::memory_order_release);
383
- const auto outPos = circular_queue<T>::m_outPos.load (std::memory_order_relaxed);
382
+ const auto outPos = circular_queue<T>::m_outPos.load (std::memory_order_acquire);
384
383
const auto inPos = circular_queue<T>::m_inPos.load (std::memory_order_relaxed);
385
384
std::atomic_thread_fence (std::memory_order_acquire);
386
385
if (inPos == outPos) return circular_queue<T>::defaultValue;
387
386
T& val = circular_queue<T>::m_buffer[inPos] = std::move (circular_queue<T>::m_buffer[outPos]);
388
387
const auto bufSize = circular_queue<T>::m_bufSize;
389
388
std::atomic_thread_fence (std::memory_order_release);
390
389
circular_queue<T>::m_outPos.store ((outPos + 1 ) % bufSize, std::memory_order_relaxed);
391
- circular_queue<T>::m_inPos.store ((inPos + 1 ) % bufSize, std::memory_order_relaxed );
390
+ circular_queue<T>::m_inPos.store ((inPos + 1 ) % bufSize, std::memory_order_release );
392
391
return val;
393
392
}
394
393
@@ -400,7 +399,7 @@ template< typename T > class circular_queue_mp : protected circular_queue<T>
400
399
*/
401
400
bool for_each_requeue (std::function<bool (T&)> fun)
402
401
{
403
- auto inPos0 = circular_queue<T>::m_inPos.load (std::memory_order_relaxed );
402
+ auto inPos0 = circular_queue<T>::m_inPos.load (std::memory_order_acquire );
404
403
auto outPos = circular_queue<T>::m_outPos.load (std::memory_order_relaxed);
405
404
std::atomic_thread_fence (std::memory_order_acquire);
406
405
if (outPos == inPos0) return false ;
@@ -418,14 +417,14 @@ template< typename T > class circular_queue_mp : protected circular_queue<T>
418
417
std::atomic_thread_fence (std::memory_order_acquire);
419
418
circular_queue<T>::m_buffer[inPos] = std::move (val);
420
419
std::atomic_thread_fence (std::memory_order_release);
421
- circular_queue<T>::m_inPos.store ((inPos + 1 ) % circular_queue<T>::m_bufSize, std::memory_order_relaxed );
420
+ circular_queue<T>::m_inPos.store ((inPos + 1 ) % circular_queue<T>::m_bufSize, std::memory_order_release );
422
421
}
423
422
else
424
423
{
425
424
std::atomic_thread_fence (std::memory_order_release);
426
425
}
427
426
outPos = (outPos + 1 ) % circular_queue<T>::m_bufSize;
428
- circular_queue<T>::m_outPos.store (outPos, std::memory_order_relaxed );
427
+ circular_queue<T>::m_outPos.store (outPos, std::memory_order_release );
429
428
} while (outPos != inPos0);
430
429
return true ;
431
430
}
0 commit comments