mirror of
https://github.com/tailix/libshmemq.git
synced 2025-02-17 15:45:41 -05:00
Rewrite examples
This commit is contained in:
parent
86a56387b7
commit
e4aea64e69
3 changed files with 22 additions and 67 deletions
|
@ -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[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Add table
Reference in a new issue