Implement pop

This commit is contained in:
Alex Kotov 2020-12-14 20:59:52 +05:00
parent 32e2fc8d07
commit 3bbf8f0a25
Signed by: kotovalexarian
GPG Key ID: 553C0EBBEB5D5F08
3 changed files with 82 additions and 0 deletions

View File

@ -25,6 +25,8 @@ typedef enum ShmemqError {
SHMEMQ_ERROR_INVALID_NAME = 1,
SHMEMQ_ERROR_BUG_POP_END_ON_EMPTY_QUEUE = 50,
SHMEMQ_ERROR_FAILED_MALLOC = 255,
SHMEMQ_ERROR_FAILED_SHM_OPEN = 254,
SHMEMQ_ERROR_FAILED_FTRUNCATE = 253,
@ -79,6 +81,10 @@ ShmemqFrame shmemq_push_start(Shmemq shmemq);
void shmemq_push_end(Shmemq shmemq, size_t data_size, ShmemqError *error_ptr);
ShmemqFrame shmemq_pop_start(Shmemq shmemq);
void shmemq_pop_end(Shmemq shmemq, ShmemqError *error_ptr);
#ifdef __cplusplus
}
#endif

View File

@ -193,3 +193,37 @@ void shmemq_push_end(
shmemq->buffer->header.write_frame_index = new_write_frame_index;
}
}
ShmemqFrame shmemq_pop_start(const Shmemq shmemq)
{
return &shmemq->buffer->frames[shmemq->buffer->header.read_frame_index];
}
void shmemq_pop_end(const Shmemq shmemq, ShmemqError *const error_ptr)
{
if (error_ptr) *error_ptr = SHMEMQ_ERROR_NONE;
if (
shmemq->buffer->header.read_frame_index ==
shmemq->buffer->header.write_frame_index
) {
*error_ptr = SHMEMQ_ERROR_BUG_POP_END_ON_EMPTY_QUEUE;
return;
}
const ShmemqFrame frame =
&shmemq->buffer->frames[shmemq->buffer->header.read_frame_index];
if (
shmemq->buffer->header.read_frame_index <
shmemq->buffer->header.write_frame_index ||
frame->header.message_frames_count != 0
) {
shmemq->buffer->header.read_frame_index +=
frame->header.message_frames_count;
return;
}
shmemq->buffer->header.read_frame_index = 0;
}

View File

@ -117,6 +117,48 @@ int main()
) == 0
);
frame = shmemq_pop_start(&consumer_shmemq);
assert(frame == &consumer_shmemq.buffer->frames[0]);
assert(producer_shmemq->buffer->header.read_frame_index == 0);
assert(frame->header.message_frames_count == 1);
assert(frame->data[0] == 123);
assert(frame->data[1] == 0);
assert(frame->data[2] == 0);
assert(frame->data[3] == 0);
shmemq_pop_end(&consumer_shmemq, &error);
assert(error == SHMEMQ_ERROR_NONE);
assert(producer_shmemq->buffer->header.read_frame_index == 1);
frame = shmemq_pop_start(&consumer_shmemq);
assert(frame == &consumer_shmemq.buffer->frames[1]);
assert(producer_shmemq->buffer->header.read_frame_index == 1);
assert(frame->header.message_frames_count == 1);
assert(frame->data[0] == 200);
assert(frame->data[1] == 1);
assert(frame->data[2] == 0);
assert(frame->data[3] == 0);
shmemq_pop_end(&consumer_shmemq, &error);
assert(error == SHMEMQ_ERROR_NONE);
assert(producer_shmemq->buffer->header.read_frame_index == 2);
frame = shmemq_pop_start(&consumer_shmemq);
assert(frame == &consumer_shmemq.buffer->frames[2]);
assert(producer_shmemq->buffer->header.read_frame_index == 2);
assert(frame->header.message_frames_count == 2);
assert(strcmp((char*)frame->data, hello_world_str) == 0);
shmemq_pop_end(&consumer_shmemq, &error);
assert(error == SHMEMQ_ERROR_NONE);
assert(producer_shmemq->buffer->header.read_frame_index == 4);
shmemq_finish(&consumer_shmemq, &error);
assert(error == SHMEMQ_ERROR_NONE);