Implemented better testing and fixed skipepd frames
This commit is contained in:
@@ -78,8 +78,9 @@ public:
|
||||
|
||||
bool Push(uint32 signalID, uint64 timestamp, void* data, uint32 size) {
|
||||
uint32 packetSize = 4 + 8 + 4 + size; // ID + TS + Size + Data
|
||||
uint32 read = readIndex;
|
||||
uint32 write = writeIndex;
|
||||
/* HI-9: use atomic loads for cross-thread index reads */
|
||||
uint32 read = __atomic_load_n(&readIndex, __ATOMIC_ACQUIRE);
|
||||
uint32 write = __atomic_load_n(&writeIndex, __ATOMIC_ACQUIRE);
|
||||
|
||||
uint32 available = 0;
|
||||
if (read <= write) {
|
||||
@@ -96,13 +97,15 @@ public:
|
||||
WriteToBuffer(&tempWrite, &size, 4);
|
||||
WriteToBuffer(&tempWrite, data, size);
|
||||
|
||||
writeIndex = tempWrite;
|
||||
// HI-9: release store so data writes are visible before index update
|
||||
__atomic_store_n(&writeIndex, tempWrite, __ATOMIC_RELEASE);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Pop(uint32 &signalID, uint64 ×tamp, void* dataBuffer, uint32 &size, uint32 maxSize) {
|
||||
uint32 read = readIndex;
|
||||
uint32 write = writeIndex;
|
||||
/* HI-9: acquire-load writeIndex to see data written by Push */
|
||||
uint32 read = __atomic_load_n(&readIndex, __ATOMIC_ACQUIRE);
|
||||
uint32 write = __atomic_load_n(&writeIndex, __ATOMIC_ACQUIRE);
|
||||
if (read == write) return false;
|
||||
|
||||
uint32 tempRead = read;
|
||||
@@ -124,9 +127,9 @@ public:
|
||||
// locate the next entry safely, so fall back to discarding everything
|
||||
// to avoid reading garbage as sample headers on future Pop() calls.
|
||||
if (tempSize >= bufferSize) {
|
||||
readIndex = write; // corrupt ring — discard all
|
||||
__atomic_store_n(&readIndex, write, __ATOMIC_RELEASE); // corrupt ring — discard all
|
||||
} else {
|
||||
readIndex = (tempRead + tempSize) % bufferSize;
|
||||
__atomic_store_n(&readIndex, (tempRead + tempSize) % bufferSize, __ATOMIC_RELEASE);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -137,13 +140,14 @@ public:
|
||||
timestamp = tempTs;
|
||||
size = tempSize;
|
||||
|
||||
readIndex = tempRead;
|
||||
// HI-9: release-store readIndex after reading data
|
||||
__atomic_store_n(&readIndex, tempRead, __ATOMIC_RELEASE);
|
||||
return true;
|
||||
}
|
||||
|
||||
uint32 Count() {
|
||||
uint32 read = readIndex;
|
||||
uint32 write = writeIndex;
|
||||
uint32 read = __atomic_load_n(&readIndex, __ATOMIC_ACQUIRE);
|
||||
uint32 write = __atomic_load_n(&writeIndex, __ATOMIC_ACQUIRE);
|
||||
if (write >= read) return write - read;
|
||||
return bufferSize - (read - write);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user