58 static constexpr size_t Capacity = 256;
60 Ps2CaptureQueue() : m_Records(), m_WriteSequence(0), m_ReadSequence(0) {}
63 const size_t write = __atomic_load_n(&m_WriteSequence, __ATOMIC_RELAXED);
64 const size_t read = __atomic_load_n(&m_ReadSequence, __ATOMIC_ACQUIRE);
65 if ((write - read) >= Capacity) {
69 m_Records[write % Capacity] = record;
70 __atomic_store_n(&m_WriteSequence, write + 1, __ATOMIC_RELEASE);
76 const size_t write = __atomic_load_n(&m_WriteSequence, __ATOMIC_RELAXED);
77 const size_t read = __atomic_load_n(&m_ReadSequence, __ATOMIC_ACQUIRE);
78 return (write - read) < Capacity;
82 const size_t read = __atomic_load_n(&m_ReadSequence, __ATOMIC_RELAXED);
83 const size_t write = __atomic_load_n(&m_WriteSequence, __ATOMIC_ACQUIRE);
88 record = m_Records[read % Capacity];
89 __atomic_store_n(&m_ReadSequence, read + 1, __ATOMIC_RELEASE);
93 size_t pending()
const {
94 const size_t write = __atomic_load_n(&m_WriteSequence, __ATOMIC_ACQUIRE);
95 const size_t read = __atomic_load_n(&m_ReadSequence, __ATOMIC_ACQUIRE);
101 __atomic_store_n(&m_WriteSequence,
static_cast<size_t>(0), __ATOMIC_RELEASE);
102 __atomic_store_n(&m_ReadSequence,
static_cast<size_t>(0), __ATOMIC_RELEASE);
107 size_t m_WriteSequence;
108 size_t m_ReadSequence;
118 return __atomic_compare_exchange_n(&m_Owned, &expected,
static_cast<size_t>(1),
false,
119 __ATOMIC_ACQUIRE, __ATOMIC_RELAXED);
123 __atomic_store_n(&m_Owned,
static_cast<size_t>(0), __ATOMIC_RELEASE);
127 return __atomic_load_n(&m_Owned, __ATOMIC_ACQUIRE) != 0;