mirror of https://github.com/mgba-emu/mgba.git
Util: Fix wrapping edge cases in RingFIFO
This commit is contained in:
parent
ca9448cd35
commit
de9bff4a29
1
CHANGES
1
CHANGES
|
@ -62,6 +62,7 @@ Bugfixes:
|
||||||
- GB Audio: Fix channel 4 initial LFSR
|
- GB Audio: Fix channel 4 initial LFSR
|
||||||
- GB, GBA Video: Don't call finishFrame twice in thread proxy
|
- GB, GBA Video: Don't call finishFrame twice in thread proxy
|
||||||
- GB Audio: Fix channel 1, 2 and 4 reset timing
|
- GB Audio: Fix channel 1, 2 and 4 reset timing
|
||||||
|
- Util: Fix wrapping edge cases in RingFIFO
|
||||||
Misc:
|
Misc:
|
||||||
- GBA Timer: Use global cycles for timers
|
- GBA Timer: Use global cycles for timers
|
||||||
- GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722)
|
- GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722)
|
||||||
|
|
|
@ -33,8 +33,8 @@ size_t RingFIFOWrite(struct RingFIFO* buffer, const void* value, size_t length)
|
||||||
ATOMIC_LOAD(end, buffer->readPtr);
|
ATOMIC_LOAD(end, buffer->readPtr);
|
||||||
|
|
||||||
// Wrap around if we can't fit enough in here
|
// Wrap around if we can't fit enough in here
|
||||||
if ((intptr_t) data - (intptr_t) buffer->data + length >= buffer->capacity) {
|
if ((uintptr_t) data - (uintptr_t) buffer->data + length >= buffer->capacity) {
|
||||||
if (end == buffer->data) {
|
if (end == buffer->data || end > data) {
|
||||||
// Oops! If we wrap now, it'll appear empty
|
// Oops! If we wrap now, it'll appear empty
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -65,8 +65,8 @@ size_t RingFIFORead(struct RingFIFO* buffer, void* output, size_t length) {
|
||||||
ATOMIC_LOAD(end, buffer->writePtr);
|
ATOMIC_LOAD(end, buffer->writePtr);
|
||||||
|
|
||||||
// Wrap around if we can't fit enough in here
|
// Wrap around if we can't fit enough in here
|
||||||
if ((intptr_t) data - (intptr_t) buffer->data + length >= buffer->capacity) {
|
if ((uintptr_t) data - (uintptr_t) buffer->data + length >= buffer->capacity) {
|
||||||
if (end == data) {
|
if (end >= data) {
|
||||||
// Oops! If we wrap now, it'll appear full
|
// Oops! If we wrap now, it'll appear full
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -78,7 +78,7 @@ size_t RingFIFORead(struct RingFIFO* buffer, void* output, size_t length) {
|
||||||
uintptr_t bufferEnd = (uintptr_t) buffer->data + buffer->capacity;
|
uintptr_t bufferEnd = (uintptr_t) buffer->data + buffer->capacity;
|
||||||
remaining = bufferEnd - (uintptr_t) data;
|
remaining = bufferEnd - (uintptr_t) data;
|
||||||
} else {
|
} else {
|
||||||
remaining = (intptr_t) end - (intptr_t) data;
|
remaining = (uintptr_t) end - (uintptr_t) data;
|
||||||
}
|
}
|
||||||
// If the pointers touch, it's empty
|
// If the pointers touch, it's empty
|
||||||
if (remaining < length) {
|
if (remaining < length) {
|
||||||
|
@ -87,6 +87,6 @@ size_t RingFIFORead(struct RingFIFO* buffer, void* output, size_t length) {
|
||||||
if (output) {
|
if (output) {
|
||||||
memcpy(output, data, length);
|
memcpy(output, data, length);
|
||||||
}
|
}
|
||||||
ATOMIC_STORE(buffer->readPtr, (void*) ((intptr_t) data + length));
|
ATOMIC_STORE(buffer->readPtr, (void*) ((uintptr_t) data + length));
|
||||||
return length;
|
return length;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue