diff --git a/examples/raw.h b/examples/raw.h index af43f92..14371c3 100644 --- a/examples/raw.h +++ b/examples/raw.h @@ -7,15 +7,6 @@ extern "C" { #endif -static const size_t BUFFER1_SIZE = 200; -static const long BUFFER1_MAGIC = 0xCAFEBABE; - -struct Queue { - size_t read_offset; - - unsigned char data[]; -}; - enum MessageType { FINISH, ONEBYTE, @@ -23,10 +14,7 @@ enum MessageType { }; struct Message { - long magic; - size_t size; enum MessageType type; - unsigned char data[]; }; diff --git a/examples/raw_receiver.c b/examples/raw_receiver.c index 84ea955..0179f0e 100644 --- a/examples/raw_receiver.c +++ b/examples/raw_receiver.c @@ -37,35 +37,18 @@ int main() assert(shmemq_error == SHMEMQ_ERROR_NONE); assert(shmemq != NULL); - struct Queue *const queue = (void*)shmemq->buffer; - - printf("Initialize queues.\n"); - - queue->read_offset = 0; - printf("Main loop.\n"); while (running) { - const struct Message *const message = (struct Message*)queue->data + queue->read_offset; + const ShmemqFrame frame = shmemq_pop_start(shmemq); - if (message->magic != BUFFER1_MAGIC) { + if (frame == NULL) { printf("No messages.\n"); sleep(1); continue; } - if (message->size > BUFFER1_SIZE - sizeof(struct Queue)) { - printf("Message too big.\n"); - break; - } - - if (message->size > BUFFER1_SIZE - sizeof(struct Queue) - queue->read_offset) { - printf("Buffer return.\n"); - queue->read_offset = 0; - continue; - } - - queue->read_offset += message->size; + const struct Message *const message = (struct Message*)frame->data; switch (message->type) { case FINISH: @@ -82,6 +65,13 @@ int main() printf("Invalid message.\n"); running = false; } + + shmemq_pop_end(shmemq, &shmemq_error); + + if (shmemq_error != SHMEMQ_ERROR_NONE) { + printf("Error: %u.\n", shmemq_error); + break; + } } printf("Destroy queue.\n"); diff --git a/examples/raw_sender.c b/examples/raw_sender.c index 711e717..4662b7f 100644 --- a/examples/raw_sender.c +++ b/examples/raw_sender.c @@ -28,31 +28,6 @@ int main() assert(shmemq_error == SHMEMQ_ERROR_NONE); assert(shmemq != NULL); - struct Queue *const queue = (void*)shmemq->buffer; - - printf("Initialize queues.\n"); - - size_t buffer1_offset = queue->read_offset; - - for (;;) { - const struct Message *const message = (struct Message*)queue->data + buffer1_offset; - - if (message->magic != BUFFER1_MAGIC) break; - - if (message->size > BUFFER1_SIZE - sizeof(struct Queue)) { - printf("Message too big.\n"); - goto finalize; - } - - if (message->size > BUFFER1_SIZE - sizeof(struct Queue) - buffer1_offset) { - printf("Buffer return.\n"); - buffer1_offset = 0; - continue; - } - - buffer1_offset += message->size; - } - printf( "REPL commands:\n" " x - exit\n" @@ -73,36 +48,38 @@ int main() break; } - struct Message *message = (struct Message*)queue->data + buffer1_offset; + const ShmemqFrame frame = shmemq_push_start(shmemq); + + struct Message *const message = (struct Message*)frame->data; switch (chr) { case 'f': { const size_t size = sizeof(*message); - buffer1_offset += size; message->type = FINISH; - message->size = size; - message->magic = BUFFER1_MAGIC; + shmemq_push_end(shmemq, size, &shmemq_error); + + if (shmemq_error != SHMEMQ_ERROR_NONE) goto finalize; } break; case '1': { const size_t size = sizeof(*message) + sizeof(unsigned char); - buffer1_offset += size; *(unsigned char*)message->data = 123; message->type = ONEBYTE; - message->size = size; - message->magic = BUFFER1_MAGIC; + shmemq_push_end(shmemq, size, &shmemq_error); + + if (shmemq_error != SHMEMQ_ERROR_NONE) goto finalize; } break; case '0': { const size_t size = sizeof(*message) + strlen(nullstr) + 1; - buffer1_offset += size; strcpy((char*)message->data, nullstr); message->type = NULLSTR; - message->size = size; - message->magic = BUFFER1_MAGIC; + shmemq_push_end(shmemq, size, &shmemq_error); + + if (shmemq_error != SHMEMQ_ERROR_NONE) goto finalize; } break; default: