diff --git a/inc/common/queue.h b/inc/common/queue.h index 14187549552a44f6fb574c19e5fae24370e75f45..95899825ac38f84f20591b1ce036636ff49e4106 100644 --- a/inc/common/queue.h +++ b/inc/common/queue.h @@ -20,5 +20,5 @@ typedef struct { mqd_t lkt_queue_open(void); void lkt_queue_close(mqd_t queue); -void lkt_queue_send(enum lkt_event_type, void *attr); +void lkt_queue_send(mqd_t, enum lkt_event_type, void *attr); lkt_event lkt_queue_handle(mqd_t queue); diff --git a/src/database/open.c b/src/database/open.c index 6cc01a60cfb485142881b78f45942a949334db73..dbe7428c014a4cc7da919070942df901a30bec62 100644 --- a/src/database/open.c +++ b/src/database/open.c @@ -55,7 +55,7 @@ database_close_all(void) } static inline void -__inc(volatile sqlite3 *db, const char *name) +__inc(volatile sqlite3 *db, const char *name, bool check) { SQLITE_EXEC(db, "UPDATE misc SET opened = (SELECT opened + 1 FROM misc);", error); @@ -76,10 +76,16 @@ __inc(volatile sqlite3 *db, const char *name) return; error: LOG_ERROR_SCT("DB", "%s", "Database already in use"); - exit(EXIT_FAILURE); + if (check) + exit(EXIT_FAILURE); + else + return; out_of_memory: LOG_ERROR_SCT("DB", "%s", "Out of memory"); - exit(EXIT_FAILURE); + if (check) + exit(EXIT_FAILURE); + else + return; } int @@ -192,8 +198,7 @@ retry: goto init; if (!__check_schema(db)) goto init; - if (check) - __inc(db, PROTECTED_DATABASE); + __inc(db, PROTECTED_DATABASE, check); return true; /* Need init */ diff --git a/src/main/server.c b/src/main/server.c index 3ba06e9e2e374bd7fcbae1d4c1fad35b7271284a..71da9f5bada7c5610efb549915da1917137cdb03 100644 --- a/src/main/server.c +++ b/src/main/server.c @@ -85,7 +85,6 @@ normal_launch: .queue = lkt_queue_open(), .kara_prefix = kara_dir, }; - memset(&srv, 0, sizeof(struct lkt_state)); /* Initialize the system. */ if (!database_new(&srv.db)) { @@ -131,7 +130,7 @@ normal_launch: char *env_current = env_get(LKT_ENV_CURRENT); if (env_current && !STR_MATCH(env_current, "NULL")) { LOG_INFO_SCT("INIT", "Restart playback from %s", env_current); - lkt_queue_send(lkt_event_play_pos, (void *) (size_t) strtol(env_current, NULL, 0)); + lkt_queue_send(srv.queue, lkt_event_play_pos, (void *) (size_t) strtol(env_current, NULL, 0)); } lkt_listen(&srv); diff --git a/src/queue.c b/src/queue.c index a7ae48a380b64e9de9d1ca8b2b6a5b99ce355ba1..50849813a7ef4ba31ae619b7b3fb7d84c08b1dde 100644 --- a/src/queue.c +++ b/src/queue.c @@ -11,15 +11,16 @@ mqd_t lkt_queue_open(void) { - errno = 0; struct mq_attr attr = { .mq_flags = O_NONBLOCK, - .mq_maxmsg = 8, + .mq_maxmsg = 10, .mq_msgsize = sizeof(void *), - .mq_curmsgs = 1, + .mq_curmsgs = 0, }; - UNUSED(&attr); - mqd_t ret = mq_open(LEKTORD_QUEUE_NAME, O_RDWR | O_CREAT, 0622, &attr); + mq_unlink(LEKTORD_QUEUE_NAME); + errno = 0; + mqd_t ret = mq_open(LEKTORD_QUEUE_NAME, O_RDWR | O_CREAT | O_NONBLOCK, + 0666, &attr); switch (errno) { case 0: @@ -48,18 +49,12 @@ lkt_queue_close(mqd_t queue) } void -lkt_queue_send(enum lkt_event_type type, void *attr) +lkt_queue_send(mqd_t queue, enum lkt_event_type type, void *attr) { errno = 0; - mqd_t queue = mq_open(LEKTORD_QUEUE_NAME, O_WRONLY); - if (queue != (mqd_t) -1) { - if (mq_send(queue, attr, sizeof(void *), type)) - LOG_WARN_SCT("QUEUE", "Failed to send msg of type %d: %s", - type, strerror(errno)); - mq_close(queue); - } else - LOG_ERROR_SCT("QUEUE", "Failed to open queue '%s': %s", - LEKTORD_QUEUE_NAME, strerror(errno)); + if (mq_send(queue, attr, sizeof(void *), type)) + LOG_WARN_SCT("QUEUE", "Failed to send msg of type %d: %s", + type, strerror(errno)); } lkt_event