mirror of https://github.com/mgba-emu/mgba.git
Fix circle buffers
This commit is contained in:
parent
0dd69e8273
commit
4a09d41aab
|
@ -6,6 +6,7 @@
|
||||||
void CircleBufferInit(struct CircleBuffer* buffer, unsigned capacity) {
|
void CircleBufferInit(struct CircleBuffer* buffer, unsigned capacity) {
|
||||||
buffer->data = malloc(capacity);
|
buffer->data = malloc(capacity);
|
||||||
buffer->capacity = capacity;
|
buffer->capacity = capacity;
|
||||||
|
buffer->size = 0;
|
||||||
buffer->readPtr = buffer->data;
|
buffer->readPtr = buffer->data;
|
||||||
buffer->writePtr = buffer->data;
|
buffer->writePtr = buffer->data;
|
||||||
}
|
}
|
||||||
|
@ -16,19 +17,12 @@ void CircleBufferDeinit(struct CircleBuffer* buffer) {
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned CircleBufferSize(const struct CircleBuffer* buffer) {
|
unsigned CircleBufferSize(const struct CircleBuffer* buffer) {
|
||||||
ptrdiff_t size = (int8_t*) buffer->writePtr - (int8_t*) buffer->readPtr;
|
return buffer->size;
|
||||||
if (size < 0) {
|
|
||||||
return buffer->capacity - size;
|
|
||||||
}
|
|
||||||
return size;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int CircleBufferWrite32(struct CircleBuffer* buffer, int32_t value) {
|
int CircleBufferWrite8(struct CircleBuffer* buffer, int8_t value) {
|
||||||
uint32_t* data = buffer->writePtr;
|
int8_t* data = buffer->writePtr;
|
||||||
if ((int8_t*) buffer->writePtr + 1 == buffer->readPtr) {
|
if (buffer->size + sizeof(int8_t) > buffer->capacity) {
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if ((int8_t*) buffer->writePtr == (int8_t*) buffer->data + buffer->capacity - 1 && buffer->readPtr == buffer->data) {
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
*data = value;
|
*data = value;
|
||||||
|
@ -39,12 +33,30 @@ int CircleBufferWrite32(struct CircleBuffer* buffer, int32_t value) {
|
||||||
} else {
|
} else {
|
||||||
buffer->writePtr = buffer->data;
|
buffer->writePtr = buffer->data;
|
||||||
}
|
}
|
||||||
|
buffer->size += sizeof(int8_t);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CircleBufferWrite32(struct CircleBuffer* buffer, int32_t value) {
|
||||||
|
int32_t* data = buffer->writePtr;
|
||||||
|
if (buffer->size + sizeof(int32_t) > buffer->capacity) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
*data = value;
|
||||||
|
++data;
|
||||||
|
ptrdiff_t size = (int8_t*) data - (int8_t*) buffer->data;
|
||||||
|
if (size < buffer->capacity) {
|
||||||
|
buffer->writePtr = data;
|
||||||
|
} else {
|
||||||
|
buffer->writePtr = buffer->data;
|
||||||
|
}
|
||||||
|
buffer->size += sizeof(int32_t);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CircleBufferRead8(struct CircleBuffer* buffer, int8_t* value) {
|
int CircleBufferRead8(struct CircleBuffer* buffer, int8_t* value) {
|
||||||
int8_t* data = buffer->readPtr;
|
int8_t* data = buffer->readPtr;
|
||||||
if (buffer->readPtr == buffer->writePtr) {
|
if (buffer->size < sizeof(int8_t)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
*value = *data;
|
*value = *data;
|
||||||
|
@ -55,12 +67,13 @@ int CircleBufferRead8(struct CircleBuffer* buffer, int8_t* value) {
|
||||||
} else {
|
} else {
|
||||||
buffer->readPtr = buffer->data;
|
buffer->readPtr = buffer->data;
|
||||||
}
|
}
|
||||||
|
buffer->size -= sizeof(int8_t);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CircleBufferRead32(struct CircleBuffer* buffer, int32_t* value) {
|
int CircleBufferRead32(struct CircleBuffer* buffer, int32_t* value) {
|
||||||
int32_t* data = buffer->readPtr;
|
int32_t* data = buffer->readPtr;
|
||||||
if (buffer->readPtr == buffer->writePtr) {
|
if (buffer->size < sizeof(int32_t)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
*value = *data;
|
*value = *data;
|
||||||
|
@ -71,5 +84,6 @@ int CircleBufferRead32(struct CircleBuffer* buffer, int32_t* value) {
|
||||||
} else {
|
} else {
|
||||||
buffer->readPtr = buffer->data;
|
buffer->readPtr = buffer->data;
|
||||||
}
|
}
|
||||||
|
buffer->size -= sizeof(int32_t);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
struct CircleBuffer {
|
struct CircleBuffer {
|
||||||
void* data;
|
void* data;
|
||||||
unsigned capacity;
|
unsigned capacity;
|
||||||
|
unsigned size;
|
||||||
void* readPtr;
|
void* readPtr;
|
||||||
void* writePtr;
|
void* writePtr;
|
||||||
};
|
};
|
||||||
|
@ -13,6 +14,7 @@ struct CircleBuffer {
|
||||||
void CircleBufferInit(struct CircleBuffer* buffer, unsigned capacity);
|
void CircleBufferInit(struct CircleBuffer* buffer, unsigned capacity);
|
||||||
void CircleBufferDeinit(struct CircleBuffer* buffer);
|
void CircleBufferDeinit(struct CircleBuffer* buffer);
|
||||||
unsigned CircleBufferSize(const struct CircleBuffer* buffer);
|
unsigned CircleBufferSize(const struct CircleBuffer* buffer);
|
||||||
|
int CircleBufferWrite8(struct CircleBuffer* buffer, int8_t value);
|
||||||
int CircleBufferWrite32(struct CircleBuffer* buffer, int32_t value);
|
int CircleBufferWrite32(struct CircleBuffer* buffer, int32_t value);
|
||||||
int CircleBufferRead8(struct CircleBuffer* buffer, int8_t* value);
|
int CircleBufferRead8(struct CircleBuffer* buffer, int8_t* value);
|
||||||
int CircleBufferRead32(struct CircleBuffer* buffer, int32_t* value);
|
int CircleBufferRead32(struct CircleBuffer* buffer, int32_t* value);
|
||||||
|
|
Loading…
Reference in New Issue