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" { extern "C" {
#endif #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 { enum MessageType {
FINISH, FINISH,
ONEBYTE, ONEBYTE,
@ -23,10 +14,7 @@ enum MessageType {
}; };
struct Message { struct Message {
long magic;
size_t size;
enum MessageType type; enum MessageType type;
unsigned char data[]; unsigned char data[];
}; };

View File

@ -37,35 +37,18 @@ int main()
assert(shmemq_error == SHMEMQ_ERROR_NONE); assert(shmemq_error == SHMEMQ_ERROR_NONE);
assert(shmemq != NULL); assert(shmemq != NULL);
struct Queue *const queue = (void*)shmemq->buffer;
printf("Initialize queues.\n");
queue->read_offset = 0;
printf("Main loop.\n"); printf("Main loop.\n");
while (running) { 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"); printf("No messages.\n");
sleep(1); sleep(1);
continue; continue;
} }
if (message->size > BUFFER1_SIZE - sizeof(struct Queue)) { const struct Message *const message = (struct Message*)frame->data;
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;
switch (message->type) { switch (message->type) {
case FINISH: case FINISH:
@ -82,6 +65,13 @@ int main()
printf("Invalid message.\n"); printf("Invalid message.\n");
running = false; 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"); printf("Destroy queue.\n");

View File

@ -28,31 +28,6 @@ int main()
assert(shmemq_error == SHMEMQ_ERROR_NONE); assert(shmemq_error == SHMEMQ_ERROR_NONE);
assert(shmemq != NULL); 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( printf(
"REPL commands:\n" "REPL commands:\n"
" x - exit\n" " x - exit\n"
@ -73,36 +48,38 @@ int main()
break; 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) { switch (chr) {
case 'f': case 'f':
{ {
const size_t size = sizeof(*message); const size_t size = sizeof(*message);
buffer1_offset += size;
message->type = FINISH; message->type = FINISH;
message->size = size; shmemq_push_end(shmemq, size, &shmemq_error);
message->magic = BUFFER1_MAGIC;
if (shmemq_error != SHMEMQ_ERROR_NONE) goto finalize;
} }
break; break;
case '1': case '1':
{ {
const size_t size = sizeof(*message) + sizeof(unsigned char); const size_t size = sizeof(*message) + sizeof(unsigned char);
buffer1_offset += size;
*(unsigned char*)message->data = 123; *(unsigned char*)message->data = 123;
message->type = ONEBYTE; message->type = ONEBYTE;
message->size = size; shmemq_push_end(shmemq, size, &shmemq_error);
message->magic = BUFFER1_MAGIC;
if (shmemq_error != SHMEMQ_ERROR_NONE) goto finalize;
} }
break; break;
case '0': case '0':
{ {
const size_t size = sizeof(*message) + strlen(nullstr) + 1; const size_t size = sizeof(*message) + strlen(nullstr) + 1;
buffer1_offset += size;
strcpy((char*)message->data, nullstr); strcpy((char*)message->data, nullstr);
message->type = NULLSTR; message->type = NULLSTR;
message->size = size; shmemq_push_end(shmemq, size, &shmemq_error);
message->magic = BUFFER1_MAGIC;
if (shmemq_error != SHMEMQ_ERROR_NONE) goto finalize;
} }
break; break;
default: default: