Fix circle buffers

This commit is contained in:
Jeffrey Pfau 2013-10-03 01:25:51 -07:00
parent 0dd69e8273
commit 4a09d41aab
2 changed files with 29 additions and 13 deletions

View File

@ -6,6 +6,7 @@
void CircleBufferInit(struct CircleBuffer* buffer, unsigned capacity) {
buffer->data = malloc(capacity);
buffer->capacity = capacity;
buffer->size = 0;
buffer->readPtr = buffer->data;
buffer->writePtr = buffer->data;
}
@ -16,19 +17,12 @@ void CircleBufferDeinit(struct CircleBuffer* buffer) {
}
unsigned CircleBufferSize(const struct CircleBuffer* buffer) {
ptrdiff_t size = (int8_t*) buffer->writePtr - (int8_t*) buffer->readPtr;
if (size < 0) {
return buffer->capacity - size;
}
return size;
return buffer->size;
}
int CircleBufferWrite32(struct CircleBuffer* buffer, int32_t value) {
uint32_t* data = buffer->writePtr;
if ((int8_t*) buffer->writePtr + 1 == buffer->readPtr) {
return 0;
}
if ((int8_t*) buffer->writePtr == (int8_t*) buffer->data + buffer->capacity - 1 && buffer->readPtr == buffer->data) {
int CircleBufferWrite8(struct CircleBuffer* buffer, int8_t value) {
int8_t* data = buffer->writePtr;
if (buffer->size + sizeof(int8_t) > buffer->capacity) {
return 0;
}
*data = value;
@ -39,12 +33,30 @@ int CircleBufferWrite32(struct CircleBuffer* buffer, int32_t value) {
} else {
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;
}
int CircleBufferRead8(struct CircleBuffer* buffer, int8_t* value) {
int8_t* data = buffer->readPtr;
if (buffer->readPtr == buffer->writePtr) {
if (buffer->size < sizeof(int8_t)) {
return 0;
}
*value = *data;
@ -55,12 +67,13 @@ int CircleBufferRead8(struct CircleBuffer* buffer, int8_t* value) {
} else {
buffer->readPtr = buffer->data;
}
buffer->size -= sizeof(int8_t);
return 1;
}
int CircleBufferRead32(struct CircleBuffer* buffer, int32_t* value) {
int32_t* data = buffer->readPtr;
if (buffer->readPtr == buffer->writePtr) {
if (buffer->size < sizeof(int32_t)) {
return 0;
}
*value = *data;
@ -71,5 +84,6 @@ int CircleBufferRead32(struct CircleBuffer* buffer, int32_t* value) {
} else {
buffer->readPtr = buffer->data;
}
buffer->size -= sizeof(int32_t);
return 1;
}

View File

@ -6,6 +6,7 @@
struct CircleBuffer {
void* data;
unsigned capacity;
unsigned size;
void* readPtr;
void* writePtr;
};
@ -13,6 +14,7 @@ struct CircleBuffer {
void CircleBufferInit(struct CircleBuffer* buffer, unsigned capacity);
void CircleBufferDeinit(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 CircleBufferRead8(struct CircleBuffer* buffer, int8_t* value);
int CircleBufferRead32(struct CircleBuffer* buffer, int32_t* value);