27 m_state.store(makeState(0, 1, 2,
false,
false), std::memory_order_relaxed);
31 int acquireWriteIndex()
noexcept
33 uint32_t state = m_state.load(std::memory_order_acquire);
34 return writeIndex(state);
38 void publishWriteIndex()
noexcept
40 uint32_t oldState, newState;
43 oldState = m_state.load(std::memory_order_acquire);
44 int w = writeIndex(oldState);
45 int r = readyIndex(oldState);
46 int rd = readIndex(oldState);
47 newState = makeState(r, w, rd,
true,
true);
48 }
while(!m_state.compare_exchange_weak(
49 oldState, newState, std::memory_order_release, std::memory_order_relaxed));
54 int acquireReadIndex()
noexcept
56 uint32_t oldState, newState;
59 oldState = m_state.load(std::memory_order_acquire);
60 if(!hasNewFrame(oldState))
68 return everReady(oldState) ? readIndex(oldState) : -1;
70 int w = writeIndex(oldState);
71 int r = readyIndex(oldState);
72 int rd = readIndex(oldState);
73 newState = makeState(w, rd, r,
false,
true);
74 }
while(!m_state.compare_exchange_weak(
75 oldState, newState, std::memory_order_release, std::memory_order_relaxed));
77 return readyIndex(oldState);
80 bool hasNewFrameAvailable()
const noexcept
82 return hasNewFrame(m_state.load(std::memory_order_acquire));
90 static constexpr uint32_t
91 makeState(
int w,
int r,
int rd,
bool hasNew,
bool ever)
noexcept
93 return (uint32_t(ever) << 7) | (uint32_t(w) << 5) | (uint32_t(r) << 3)
94 | (uint32_t(rd) << 1) | (hasNew ? 1 : 0);
96 static constexpr int writeIndex(uint32_t state)
noexcept {
return (state >> 5) & 3; }
97 static constexpr int readyIndex(uint32_t state)
noexcept {
return (state >> 3) & 3; }
98 static constexpr int readIndex(uint32_t state)
noexcept {
return (state >> 1) & 3; }
99 static constexpr bool hasNewFrame(uint32_t state)
noexcept {
return state & 1; }
100 static constexpr bool everReady(uint32_t state)
noexcept {
return (state >> 7) & 1; }
102 std::atomic<uint32_t> m_state;