mirror of https://github.com/tailix/libshmemq.git
Implement pop
This commit is contained in:
parent
32e2fc8d07
commit
3bbf8f0a25
|
@ -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
|
||||
|
|
34
src/main.c
34
src/main.c
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue