From 9c26a28374fde5cb857d0881815b03351457883e Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Wed, 13 May 2020 19:38:21 +0200
Subject: [PATCH] WIP: tryfix

---
 inc/common/queue.h  |  2 +-
 src/database/open.c | 15 ++++++++++-----
 src/main/server.c   |  3 +--
 src/queue.c         | 25 ++++++++++---------------
 4 files changed, 22 insertions(+), 23 deletions(-)

diff --git a/inc/common/queue.h b/inc/common/queue.h
index 14187549..95899825 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 6cc01a60..dbe7428c 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 3ba06e9e..71da9f5b 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 a7ae48a3..50849813 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
-- 
GitLab