From 9148f7338d819108c211be96d3c9010ae09382cb Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Tue, 29 Oct 2019 19:30:52 +0100
Subject: Improved concurrency handle with connected clients.

---
 src/analysis/db/cdb.c | 37 +++++++++++++++++++++++++++++++++----
 1 file changed, 33 insertions(+), 4 deletions(-)

diff --git a/src/analysis/db/cdb.c b/src/analysis/db/cdb.c
index 92624f6..f93d32d 100644
--- a/src/analysis/db/cdb.c
+++ b/src/analysis/db/cdb.c
@@ -157,6 +157,9 @@ static bool g_cdb_archive_send_snapshot_update(GCdbArchive *, packed_buffer *);
 static bool g_cdb_archive_send_snapshot_change(GCdbArchive *, packed_buffer *);
 
 /* Dissocie un utilisateur de l'archive. */
+static void _g_cdb_archive_remove_client(GCdbArchive *, size_t);
+
+/* Dissocie un utilisateur de l'archive. */
 static void g_cdb_archive_remove_client(GCdbArchive *, size_t);
 
 
@@ -1215,6 +1218,8 @@ static void g_cdb_archive_send_reply_to_all_clients(GCdbArchive *archive, packed
     size_t i;                               /* Boucle de parcours          */
     bool status;                            /* Bilan d'une émission        */
 
+    g_mutex_lock(&archive->clients_access);
+
     for (i = 0; i < archive->count; i++)
     {
         status = ssl_send_packed_buffer(pbuf, archive->clients[i].ssl_fd);
@@ -1222,13 +1227,15 @@ static void g_cdb_archive_send_reply_to_all_clients(GCdbArchive *archive, packed
         {
             log_variadic_message(LMT_ERROR, _("Error while replying to client %zu"), i);
 
-            g_cdb_archive_remove_client(archive, i);
+            _g_cdb_archive_remove_client(archive, i);
             i--;
 
         }
 
     }
 
+    g_mutex_unlock(&archive->clients_access);
+
 }
 
 
@@ -1419,13 +1426,13 @@ void g_cdb_archive_add_client(GCdbArchive *archive, SSL *fd)
 *                                                                             *
 ******************************************************************************/
 
-static void g_cdb_archive_remove_client(GCdbArchive *archive, size_t index)
+static void _g_cdb_archive_remove_client(GCdbArchive *archive, size_t index)
 {
     cdb_client *client;                     /* Client à traiter            */
 
-    client = &archive->clients[index];
+    assert(!g_mutex_trylock(&archive->clients_access));
 
-    g_mutex_lock(&archive->clients_access);
+    client = &archive->clients[index];
 
     SSL_free(client->ssl_fd);
     free(client->user);
@@ -1436,6 +1443,28 @@ static void g_cdb_archive_remove_client(GCdbArchive *archive, size_t index)
 
     archive->clients = realloc(archive->clients, --archive->count * sizeof(cdb_client));
 
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : archive = archive à connecter avec un utilisateur.           *
+*                index   = indice de l'utilisateur concerné.                  *
+*                                                                             *
+*  Description : Dissocie un utilisateur de l'archive.                        *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void g_cdb_archive_remove_client(GCdbArchive *archive, size_t index)
+{
+    g_mutex_lock(&archive->clients_access);
+
+    _g_cdb_archive_remove_client(archive, index);
+
     g_mutex_unlock(&archive->clients_access);
 
 }
-- 
cgit v0.11.2-87-g4458