Skip to content

Commit f07c969

Browse files
committed
Lastest circular_queue: updated memory fences
1 parent c7fc06c commit f07c969

File tree

1 file changed

+17
-18
lines changed

1 file changed

+17
-18
lines changed

libraries/Schedule/src/circular_queue/circular_queue.h

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ template< typename T > class circular_queue
103103
m_bufSize = cap + 1;
104104
std::atomic_thread_fence(std::memory_order_release);
105105
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);
107107
return true;
108108
}
109109

@@ -142,7 +142,7 @@ template< typename T > class circular_queue
142142
*/
143143
T peek() const
144144
{
145-
const auto outPos = m_outPos.load(std::memory_order_relaxed);
145+
const auto outPos = m_outPos.load(std::memory_order_acquire);
146146
const auto inPos = m_inPos.load(std::memory_order_relaxed);
147147
std::atomic_thread_fence(std::memory_order_acquire);
148148
if (inPos == outPos) return defaultValue;
@@ -156,7 +156,7 @@ template< typename T > class circular_queue
156156
*/
157157
bool IRAM_ATTR push(T&& val)
158158
{
159-
const auto inPos = m_inPos.load(std::memory_order_relaxed);
159+
const auto inPos = m_inPos.load(std::memory_order_acquire);
160160
const unsigned next = (inPos + 1) % m_bufSize;
161161
if (next == m_outPos.load(std::memory_order_relaxed)) {
162162
return false;
@@ -168,7 +168,7 @@ template< typename T > class circular_queue
168168

169169
std::atomic_thread_fence(std::memory_order_release);
170170

171-
m_inPos.store(next, std::memory_order_relaxed);
171+
m_inPos.store(next, std::memory_order_release);
172172
return true;
173173
}
174174

@@ -190,7 +190,7 @@ template< typename T > class circular_queue
190190
*/
191191
size_t push_n(const T* buffer, size_t size)
192192
{
193-
const auto inPos = m_inPos.load(std::memory_order_relaxed);
193+
const auto inPos = m_inPos.load(std::memory_order_acquire);
194194
const auto outPos = m_outPos.load(std::memory_order_relaxed);
195195

196196
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
209209

210210
std::atomic_thread_fence(std::memory_order_release);
211211

212-
m_inPos.store(next, std::memory_order_relaxed);
212+
m_inPos.store(next, std::memory_order_release);
213213
return blockSize + size;
214214
}
215215

@@ -220,7 +220,7 @@ template< typename T > class circular_queue
220220
*/
221221
T pop()
222222
{
223-
const auto outPos = m_outPos.load(std::memory_order_relaxed);
223+
const auto outPos = m_outPos.load(std::memory_order_acquire);
224224
if (m_inPos.load(std::memory_order_relaxed) == outPos) return defaultValue;
225225

226226
std::atomic_thread_fence(std::memory_order_acquire);
@@ -229,7 +229,7 @@ template< typename T > class circular_queue
229229

230230
std::atomic_thread_fence(std::memory_order_release);
231231

232-
m_outPos.store((outPos + 1) % m_bufSize, std::memory_order_relaxed);
232+
m_outPos.store((outPos + 1) % m_bufSize, std::memory_order_release);
233233
return val;
234234
}
235235

@@ -241,7 +241,7 @@ template< typename T > class circular_queue
241241
size_t pop_n(T* buffer, size_t size) {
242242
size_t avail = size = std::min(size, available());
243243
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);
245245
size_t n = std::min(avail, static_cast<size_t>(m_bufSize - outPos));
246246

247247
std::atomic_thread_fence(std::memory_order_acquire);
@@ -252,7 +252,7 @@ template< typename T > class circular_queue
252252

253253
std::atomic_thread_fence(std::memory_order_release);
254254

255-
m_outPos.store((outPos + size) % m_bufSize, std::memory_order_relaxed);
255+
m_outPos.store((outPos + size) % m_bufSize, std::memory_order_release);
256256
return size;
257257
}
258258

@@ -262,15 +262,15 @@ template< typename T > class circular_queue
262262
*/
263263
void for_each(std::function<void(T&&)> fun)
264264
{
265-
auto outPos = m_outPos.load(std::memory_order_relaxed);
265+
auto outPos = m_outPos.load(std::memory_order_acquire);
266266
const auto inPos = m_inPos.load(std::memory_order_relaxed);
267267
std::atomic_thread_fence(std::memory_order_acquire);
268268
while (outPos != inPos)
269269
{
270270
fun(std::move(m_buffer[outPos]));
271271
std::atomic_thread_fence(std::memory_order_release);
272272
outPos = (outPos + 1) % m_bufSize;
273-
m_outPos.store(outPos, std::memory_order_relaxed);
273+
m_outPos.store(outPos, std::memory_order_release);
274274
}
275275
}
276276

@@ -379,16 +379,15 @@ template< typename T > class circular_queue_mp : protected circular_queue<T>
379379
#else
380380
std::lock_guard<std::mutex> lock(m_pushMtx);
381381
#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);
384383
const auto inPos = circular_queue<T>::m_inPos.load(std::memory_order_relaxed);
385384
std::atomic_thread_fence(std::memory_order_acquire);
386385
if (inPos == outPos) return circular_queue<T>::defaultValue;
387386
T& val = circular_queue<T>::m_buffer[inPos] = std::move(circular_queue<T>::m_buffer[outPos]);
388387
const auto bufSize = circular_queue<T>::m_bufSize;
389388
std::atomic_thread_fence(std::memory_order_release);
390389
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);
392391
return val;
393392
}
394393

@@ -400,7 +399,7 @@ template< typename T > class circular_queue_mp : protected circular_queue<T>
400399
*/
401400
bool for_each_requeue(std::function<bool(T&)> fun)
402401
{
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);
404403
auto outPos = circular_queue<T>::m_outPos.load(std::memory_order_relaxed);
405404
std::atomic_thread_fence(std::memory_order_acquire);
406405
if (outPos == inPos0) return false;
@@ -418,14 +417,14 @@ template< typename T > class circular_queue_mp : protected circular_queue<T>
418417
std::atomic_thread_fence(std::memory_order_acquire);
419418
circular_queue<T>::m_buffer[inPos] = std::move(val);
420419
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);
422421
}
423422
else
424423
{
425424
std::atomic_thread_fence(std::memory_order_release);
426425
}
427426
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);
429428
} while (outPos != inPos0);
430429
return true;
431430
}

0 commit comments

Comments
 (0)