diff --git a/inc/common/queue.h b/inc/common/queue.h new file mode 100644 index 0000000000000000000000000000000000000000..d80806a5dc940281409157b9de03927e2c248ac3 --- /dev/null +++ b/inc/common/queue.h @@ -0,0 +1,24 @@ +#pragma once + +#include <fcntl.h> +#include <sys/stat.h> +#include <mqueue.h> + +#define LEKTORD_QUEUE_NAME "LEKTORD_QUEUE" + +enum lkt_event_type { + lkt_event_null = 0, /* NULL */ + lkt_event_play_pos = 10, /* size_t */ + lkt_event_play_file = 11, /* const char* */ +} type; + +typedef struct { + unsigned int type; + void *attr; +} lkt_event; + +mqd_t lkt_queue_open(void); +void lkt_queue_close(mqd_t queue); + +void lkt_queue_send(enum lkt_event_type, void *attr); +lkt_event lkt_queue_handle(mqd_t queue); diff --git a/meson.build b/meson.build index d3a1af2027754a1fab4de39f63da1c8dec346157..4c1dc2a02fdf4f1bf3b746db0b67e809d3bfe5d8 100644 --- a/meson.build +++ b/meson.build @@ -54,6 +54,7 @@ mthread_sources = [ 'src/mthread/mthread.c' ## Common files common_sources = [ 'src/common.c' , 'src/stack.c' + , 'src/queue.c' , 'src/bufferfd.c' ] diff --git a/src/queue.c b/src/queue.c new file mode 100644 index 0000000000000000000000000000000000000000..bd6585311bcae957fbb0b4022023944958a092cf --- /dev/null +++ b/src/queue.c @@ -0,0 +1,67 @@ +#define _POSIX_C_SOURCE 200809L + +#include <errno.h> +#include <stdlib.h> +#include <stddef.h> +#include <string.h> +#include <stdio.h> +#include <common/common.h> +#include <common/queue.h> + +mqd_t +lkt_queue_open(void) +{ + errno = 0; + mqd_t ret = mq_open(LEKTORD_QUEUE_NAME, O_RDONLY | O_CREAT | O_NONBLOCK); /* Check EAGAIN */ + + switch (errno) { + case 0: + return ret; + + case EACCES: + LOG_ERROR_SCT("QUEUE", "Queue %s already exists", LEKTORD_QUEUE_NAME); + return 0; + + case ENOMEM: + LOG_ERROR_SCT("QUEUE", "%s", "Out of memory"); + exit(EXIT_FAILURE); + + default: + LOG_ERROR_SCT("QUEUE", "Unhandled error '%d'", errno); + exit(EXIT_FAILURE); + } + +} + +void +lkt_queue_close(mqd_t queue) +{ + mq_unlink(LEKTORD_QUEUE_NAME); + mq_close(queue); +} + +void +lkt_queue_send(enum lkt_event_type type, void *attr) +{ + mqd_t queue = mq_open(LEKTORD_QUEUE_NAME, O_WRONLY); + if (queue >= 0) { + if (mq_send(queue, attr, sizeof(void *), type)) + LOG_WARN_SCT("QUEUE", "Failed to send msg of type %d", type); + mq_close(queue); + } else + LOG_ERROR_SCT("QUEUE", "Failed to open queue '%s'", LEKTORD_QUEUE_NAME); +} + +lkt_event +lkt_queue_handle(mqd_t queue) +{ + lkt_event event; + errno = 0; + ssize_t len = mq_receive(queue, event.attr, sizeof(void *), &event.type); + + if (len <= 0 || errno == EAGAIN) { + memset(&event, 0, sizeof(lkt_event)); + return event; + } else + return event; +}