Rewrite examples

This commit is contained in:
Alex Kotov 2020-12-14 21:17:26 +05:00
parent 86a56387b7
commit e4aea64e69
Signed by: kotovalexarian
GPG Key ID: 553C0EBBEB5D5F08
3 changed files with 22 additions and 67 deletions

View File

@ -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[];
};

View File

@ -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");

View File

@ -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: