From f505830e800e4061d6e57c2b0769f956e70a2d84 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Sun, 25 Aug 2024 00:30:08 +0200
Subject: Load (some) core components again.

---
 src/app.c            |  15 ++++++-
 src/core/Makefile.am |   4 +-
 src/core/core.c      |  75 ++++++++++++++++++++++++++++++++++-
 src/core/core.h      |  11 ++----
 src/core/global.c    | 108 ++++++++++++++++++++++++++++++++-------------------
 src/core/global.h    |  25 ++++++++++--
 6 files changed, 184 insertions(+), 54 deletions(-)

diff --git a/src/app.c b/src/app.c
index 15fe255..2e0d4fa 100644
--- a/src/app.c
+++ b/src/app.c
@@ -35,9 +35,11 @@
 #include "app.h"
 #include "common/io.h"
 #include "common/xdg.h"
+#include "core/core.h"
 #include "core/logs.h"
 #include "gui/core/core.h"
 #include "gui/window.h"
+#include "plugins/pglist.h"
 
 
 
@@ -503,9 +505,14 @@ int main(int argc, char **argv)
 
     set_log_verbosity(verbosity);
 
-    if (!load_gui_components(AGC_BUFFER_FEATURES | AGC_PANELS))
+    if (!load_core_components(ACC_GLOBAL_VARS))
         goto exit;
 
+    if (!load_gui_components(AGC_BUFFER_FEATURES | AGC_PANELS))
+        goto exit_with_core;
+
+    init_all_plugins(true);
+
     ensure_wm_icon_and_name();
 
     g_set_prgname("Chrysalide");
@@ -516,8 +523,14 @@ int main(int argc, char **argv)
 
     g_object_unref(G_OBJECT(app));
 
+    exit_all_plugins();
+
     unload_gui_components(AGC_BUFFER_FEATURES | AGC_PANELS);
 
+ exit_with_core:
+
+    unload_core_components(ACC_GLOBAL_VARS);
+
  exit:
 
     return result;
diff --git a/src/core/Makefile.am b/src/core/Makefile.am
index 88d2892..de34d03 100644
--- a/src/core/Makefile.am
+++ b/src/core/Makefile.am
@@ -4,9 +4,7 @@ noinst_LTLIBRARIES = libcore4.la # libcore.la
 libcore_la_SOURCES =					\
 	collections.h collections.c			\
 	columns.h							\
-	core.h core.c						\
 	demanglers.h demanglers.c			\
-	global.h global.c					\
 	logs.h logs.c						\
 	params.h params.c					\
 	paths.h paths.c						\
@@ -17,6 +15,8 @@ libcore_la_CFLAGS = $(TOOLKIT_CFLAGS) $(LIBXML_CFLAGS)
 
 
 libcore4_la_SOURCES =						\
+	core.h core.c							\
+	global.h global.c						\
 	logs.h logs.c							\
 	nproc.h nproc.c							\
 	paths.h paths.c
diff --git a/src/core/core.c b/src/core/core.c
index f67e23d..1f40cb3 100644
--- a/src/core/core.c
+++ b/src/core/core.c
@@ -2,7 +2,7 @@
 /* Chrysalide - Outil d'analyse de fichiers binaires
  * core.c - chargement et le déchargement du tronc commun
  *
- * Copyright (C) 2014-2019 Cyrille Bagard
+ * Copyright (C) 2014-2024 Cyrille Bagard
  *
  *  This file is part of Chrysalide.
  *
@@ -24,6 +24,77 @@
 #include "core.h"
 
 
+#include "global.h"
+
+
+
+/* Statuts de chargement */
+static AvailableCoreComponent __loaded = ACC_NONE;
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : flags = liste d'éléments à charger.                          *
+*                                                                             *
+*  Description : Charge une sélection d'éléments de base du programme.        *
+*                                                                             *
+*  Retour      : Bilan de l'opération.                                        *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+bool load_core_components(AvailableCoreComponent flags)
+{
+    bool result;                            /* Bilan à retourner           */
+
+    result = true;
+
+    if ((flags & ACC_GLOBAL_VARS) != 0 && (__loaded & ACC_GLOBAL_VARS) == 0)
+    {
+        set_work_queue(g_work_queue_new());
+
+        __loaded |= ACC_GLOBAL_VARS;
+
+    }
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : flags = liste d'éléments à décharger.                        *
+*                                                                             *
+*  Description : Décharge une sélection d'éléments de base du programme.      *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+void unload_core_components(AvailableCoreComponent flags)
+{
+    if ((flags & ACC_GLOBAL_VARS) != 0 && (__loaded & ACC_GLOBAL_VARS) == 0)
+    {
+        set_work_queue(NULL);
+
+        __loaded &= ~ACC_GLOBAL_VARS;
+
+    }
+
+}
+
+
+
+
+
+
+
+#if 0
+
 #include <stdlib.h>
 #include <time.h>
 #include <unistd.h>
@@ -255,3 +326,5 @@ void unload_core_components(AvailableCoreComponent flags)
     }
 
 }
+
+#endif
diff --git a/src/core/core.h b/src/core/core.h
index def2813..7c50f6c 100644
--- a/src/core/core.h
+++ b/src/core/core.h
@@ -2,7 +2,7 @@
 /* Chrysalide - Outil d'analyse de fichiers binaires
  * core.h - prototypes pour le chargement et le déchargement du tronc commun
  *
- * Copyright (C) 2014-2018 Cyrille Bagard
+ * Copyright (C) 2014-2024 Cyrille Bagard
  *
  *  This file is part of Chrysalide.
  *
@@ -29,16 +29,11 @@
 
 
 
-/* Charge les éléments de base du programme. */
-bool load_all_core_components(bool);
-
-/* Décharge les éléments de base du programme. */
-void unload_all_core_components(bool);
-
-
 /* Eléments à (dé)charger disponibles */
 typedef enum _AvailableCoreComponent
 {
+    ACC_NONE          = (0 << 0),           /* Statut initial              */
+    ACC_GLOBAL_VARS   = (1 << 0),           /* Singletons globaux          */
     ACC_SCAN_FEATURES = (1 << 0),           /* Espace de noms pour scan    */
 
 } AvailableCoreComponent;
diff --git a/src/core/global.c b/src/core/global.c
index c99d711..83d8f4a 100644
--- a/src/core/global.c
+++ b/src/core/global.c
@@ -2,7 +2,7 @@
 /* Chrysalide - Outil d'analyse de fichiers binaires
  * global.c - conservation et accès aux variables globales
  *
- * Copyright (C) 2017-2019 Cyrille Bagard
+ * Copyright (C) 2017-2024 Cyrille Bagard
  *
  *  This file is part of Chrysalide.
  *
@@ -24,38 +24,19 @@
 #include "global.h"
 
 
-#include <assert.h>
-
+#include "../glibext/helpers.h"
 
 
-/* Mode de fonctionnement */
-static bool _batch_mode = false;
 
 /* Gestionnaire de tâches parallèles */
 static GWorkQueue *_queue = NULL;
 
-/* Explorateur de contenus */
-static GContentExplorer *_explorer = NULL;
-
-/* Résolveur de contenus */
-static GContentResolver *_resolver = NULL;
-
-/* Espace de noms racine pour ROST */
-static GScanNamespace *_rost_root_ns = NULL;
-
-/* Projet global actif */
-static GStudyProject *_project = NULL;
-
-/* Avertisseur de changement de projet principal */
-static current_project_change_cb _project_notify = NULL;
-
-
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : -                                                            *
+*  Paramètres  : queue = nouveau gestionnaire à mémoriser ou NULL.            *
 *                                                                             *
-*  Description : Note un mode d'exécution sans interface.                     *
+*  Description : Définit le gestionnaire de traitements parallèles courant.   *
 *                                                                             *
 *  Retour      : -                                                            *
 *                                                                             *
@@ -63,9 +44,12 @@ static current_project_change_cb _project_notify = NULL;
 *                                                                             *
 ******************************************************************************/
 
-void set_batch_mode(void)
+void set_work_queue(/* __steal */GWorkQueue *queue)
 {
-    _batch_mode = true;
+    if (_queue != NULL)
+        unref_object(_queue);
+
+    _queue = queue;
 
 }
 
@@ -74,26 +58,70 @@ void set_batch_mode(void)
 *                                                                             *
 *  Paramètres  : -                                                            *
 *                                                                             *
-*  Description : Indique le mode d'exécution courant du programme.            *
+*  Description : Fournit le gestionnaire de traitements parallèles courant.   *
 *                                                                             *
-*  Retour      : true si le fonctionnement est sans interface.                *
+*  Retour      : Gestionnaire de traitements parallèles courant.              *
 *                                                                             *
 *  Remarques   : -                                                            *
 *                                                                             *
 ******************************************************************************/
 
-bool is_batch_mode(void)
+GWorkQueue *get_work_queue(void)
 {
-    return _batch_mode;
+    ref_object(_queue);
+
+    return _queue;
 
 }
 
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+#if 0
+
+#include <assert.h>
+
+
+
+/* Mode de fonctionnement */
+static bool _batch_mode = false;
+
+/* Gestionnaire de tâches parallèles */
+//static GWorkQueue *_queue = NULL;
+
+/* Explorateur de contenus */
+static GContentExplorer *_explorer = NULL;
+
+/* Résolveur de contenus */
+static GContentResolver *_resolver = NULL;
+
+/* Espace de noms racine pour ROST */
+static GScanNamespace *_rost_root_ns = NULL;
+
+/* Projet global actif */
+static GStudyProject *_project = NULL;
+
+/* Avertisseur de changement de projet principal */
+static current_project_change_cb _project_notify = NULL;
+
+
+
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : queue = nouveau gestionnaire à mémoriser ou NULL.            *
+*  Paramètres  : -                                                            *
 *                                                                             *
-*  Description : Définit le gestionnaire de traitements parallèles courant.   *
+*  Description : Note un mode d'exécution sans interface.                     *
 *                                                                             *
 *  Retour      : -                                                            *
 *                                                                             *
@@ -101,11 +129,9 @@ bool is_batch_mode(void)
 *                                                                             *
 ******************************************************************************/
 
-void set_work_queue(GWorkQueue *queue)
+void set_batch_mode(void)
 {
-    assert(_queue == NULL);
-
-    _queue = queue;
+    _batch_mode = true;
 
 }
 
@@ -114,21 +140,23 @@ void set_work_queue(GWorkQueue *queue)
 *                                                                             *
 *  Paramètres  : -                                                            *
 *                                                                             *
-*  Description : Fournit le gestionnaire de traitements parallèles courant.   *
+*  Description : Indique le mode d'exécution courant du programme.            *
 *                                                                             *
-*  Retour      : Gestionnaire de traitements parallèles courant.              *
+*  Retour      : true si le fonctionnement est sans interface.                *
 *                                                                             *
 *  Remarques   : -                                                            *
 *                                                                             *
 ******************************************************************************/
 
-GWorkQueue *get_work_queue(void)
+bool is_batch_mode(void)
 {
-    return _queue;
+    return _batch_mode;
 
 }
 
 
+
+
 /******************************************************************************
 *                                                                             *
 *  Paramètres  : explorer = éventuelle adresse du nouveau gestionnaire.       *
@@ -343,3 +371,5 @@ void register_project_change_notification(current_project_change_cb notify)
     _project_notify = notify;
 
 }
+
+#endif
diff --git a/src/core/global.h b/src/core/global.h
index 0a9172b..61b7712 100644
--- a/src/core/global.h
+++ b/src/core/global.h
@@ -2,7 +2,7 @@
 /* Chrysalide - Outil d'analyse de fichiers binaires
  * global.h - prototypes pour la conservation et l'accès aux variables globales
  *
- * Copyright (C) 2017-2018 Cyrille Bagard
+ * Copyright (C) 2017-2024 Cyrille Bagard
  *
  *  This file is part of Chrysalide.
  *
@@ -25,6 +25,22 @@
 #define _CORE_GLOBAL_H
 
 
+#include "../glibext/workqueue.h"
+
+
+
+/* Définit le gestionnaire de traitements parallèles courant. */
+void set_work_queue(/* __steal */GWorkQueue *);
+
+/* Fournit le gestionnaire de traitements parallèles courant. */
+GWorkQueue *get_work_queue(void);
+
+
+
+
+
+#if 0
+
 #include <stdbool.h>
 
 
@@ -42,10 +58,10 @@ void set_batch_mode(void);
 bool is_batch_mode(void);
 
 /* Définit le gestionnaire de traitements parallèles courant. */
-void set_work_queue(GWorkQueue *);
+//void set_work_queue(GWorkQueue *);
 
 /* Fournit le gestionnaire de traitements parallèles courant. */
-GWorkQueue *get_work_queue(void);
+//GWorkQueue *get_work_queue(void);
 
 /* Définit l'adresse de l'explorateur de contenus courant. */
 void set_current_content_explorer(GContentExplorer *);
@@ -78,5 +94,8 @@ typedef void (* current_project_change_cb) (GStudyProject *, bool);
 void register_project_change_notification(current_project_change_cb);
 
 
+#endif
+
+
 
 #endif  /* _CORE_GLOBAL_H */
-- 
cgit v0.11.2-87-g4458