Files
dusklight/libs/TRK_MINNOW_DOLPHIN/utils/common/CircleBuffer.c
T
TakaRikka 82a28f7a23 most of TRK done / some misc work (#2030)
* work on d_file_sel_warning

* various cleanup

* attempt to fix d_gameover

* event cleanup

* trk work

* most of TRK done

* remove asm
2024-01-12 18:43:52 -08:00

74 lines
2.3 KiB
C

#include "TRK_MINNOW_DOLPHIN/utils/common/CircleBuffer.h"
/* 80372900-80372908 36D240 0008+00 0/0 2/2 0/0 .text CBGetBytesAvailableForRead */
u32 CBGetBytesAvailableForRead(CircleBuffer* cb) {
return cb->mBytesToRead;
}
/* 803728B0-80372900 36D1F0 0050+00 0/0 2/2 0/0 .text CircleBufferInitialize */
void CircleBufferInitialize(CircleBuffer* cb, u8* buf, s32 size) {
cb->start_ptr = buf;
cb->size = size;
cb->read_ptr = cb->start_ptr;
cb->write_ptr = cb->start_ptr;
cb->mBytesToRead = 0;
cb->mBytesToWrite = cb->size;
MWInitializeCriticalSection(&cb->mCriticalSection);
}
/* 803727A8-803728B0 36D0E8 0108+00 0/0 4/4 0/0 .text CircleBufferWriteBytes */
int CircleBufferWriteBytes(CircleBuffer* cb, u8* buf, u32 size) {
int availSize;
if (size > cb->mBytesToWrite) {
return -1;
}
MWEnterCriticalSection(&cb->mCriticalSection);
availSize = cb->size - (cb->write_ptr - cb->start_ptr);
if (availSize >= size) {
memcpy(cb->write_ptr, buf, size);
cb->write_ptr += size;
} else {
memcpy(cb->write_ptr, buf, availSize);
memcpy(cb->start_ptr, buf + availSize, size - availSize);
cb->write_ptr = cb->start_ptr + size - availSize;
}
if (cb->size == (cb->write_ptr - cb->start_ptr)) {
cb->write_ptr = cb->start_ptr;
}
cb->mBytesToWrite -= size;
cb->mBytesToRead += size;
MWExitCriticalSection(&cb->mCriticalSection);
return 0;
}
/* 803726A0-803727A8 36CFE0 0108+00 0/0 2/2 0/0 .text CircleBufferReadBytes */
int CircleBufferReadBytes(CircleBuffer* cb, u8* buf, u32 size) {
int availSize;
if (size > cb->mBytesToRead) {
return -1;
}
MWEnterCriticalSection(&cb->mCriticalSection);
availSize = cb->size - (cb->read_ptr - cb->start_ptr);
if (size < availSize) {
memcpy(buf, cb->read_ptr, size);
cb->read_ptr += size;
} else {
memcpy(buf, cb->read_ptr, availSize);
memcpy(buf + availSize, cb->start_ptr, size - availSize);
cb->read_ptr = cb->start_ptr + size - availSize;
}
if (cb->size == (cb->read_ptr - cb->start_ptr)) {
cb->read_ptr = cb->start_ptr;
}
cb->mBytesToWrite += size;
cb->mBytesToRead -= size;
MWExitCriticalSection(&cb->mCriticalSection);
return 0;
}