Skip to content
Extraits de code Groupes Projets
Vérifiée Valider f94bb36f rédigé par Kubat's avatar Kubat
Parcourir les fichiers

A simple queue implementation

parent dc8d5b26
Aucune branche associée trouvée
Aucune étiquette associée trouvée
1 requête de fusion!95Process queue
#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);
......@@ -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'
]
......
#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;
}
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter