feat: initialize external tools asynchronously

This commit is contained in:
grayTerminal-sh 2026-07-18 11:29:56 +02:00
parent 26a8f08187
commit e1e9f23457
6 changed files with 3238 additions and 2 deletions

View file

@ -46,6 +46,7 @@ TEST_TOOL_REGISTRY := tests/test_tool_registry
TEST_TOOL_PROCESS := tests/test_tool_process TEST_TOOL_PROCESS := tests/test_tool_process
TEST_TOOL_TASK := tests/test_tool_task TEST_TOOL_TASK := tests/test_tool_task
TEST_TOOL_CATALOG := tests/test_tool_catalog TEST_TOOL_CATALOG := tests/test_tool_catalog
TEST_TOOL_INITIALIZER := tests/test_tool_initializer
all: $(TARGET) all: $(TARGET)
@ -179,6 +180,16 @@ $(TEST_TOOL_CATALOG): \
src/core/tool_process.c src/core/tool_process.c
$(CC) $(TEST_CFLAGS) $^ -o $@ $(TEST_LDFLAGS) $(CC) $(TEST_CFLAGS) $^ -o $@ $(TEST_LDFLAGS)
$(TEST_TOOL_INITIALIZER): \
tests/test_tool_initializer.c \
src/core/tool_initializer.c \
src/core/task_manager.c \
src/core/background_task.c \
src/core/tool_registry.c \
src/core/tool_catalog.c \
src/core/tool_process.c
$(CC) $(TEST_CFLAGS) $^ -o $@ $(TEST_LDFLAGS)
test: \ test: \
$(TEST_NODE) \ $(TEST_NODE) \
$(TEST_TREE_MODEL) \ $(TEST_TREE_MODEL) \
@ -196,7 +207,8 @@ test: \
$(TEST_TOOL_REGISTRY) \ $(TEST_TOOL_REGISTRY) \
$(TEST_TOOL_PROCESS) \ $(TEST_TOOL_PROCESS) \
$(TEST_TOOL_TASK) \ $(TEST_TOOL_TASK) \
$(TEST_TOOL_CATALOG) $(TEST_TOOL_CATALOG) \
$(TEST_TOOL_INITIALIZER)
@echo "Exécution des tests..." @echo "Exécution des tests..."
@./$(TEST_NODE) @./$(TEST_NODE)
@./$(TEST_TREE_MODEL) @./$(TEST_TREE_MODEL)
@ -215,6 +227,7 @@ test: \
@$(TEST_TOOL_PROCESS) @$(TEST_TOOL_PROCESS)
@$(TEST_TOOL_TASK) @$(TEST_TOOL_TASK)
@$(TEST_TOOL_CATALOG) @$(TEST_TOOL_CATALOG)
@$(TEST_TOOL_INITIALIZER)
@echo "Tous les tests sont valides." @echo "Tous les tests sont valides."
%.o: %.c %.o: %.c
@ -241,6 +254,7 @@ clean:
$(TEST_TOOL_REGISTRY) \ $(TEST_TOOL_REGISTRY) \
$(TEST_TOOL_PROCESS) \ $(TEST_TOOL_PROCESS) \
$(TEST_TOOL_TASK) \ $(TEST_TOOL_TASK) \
$(TEST_TOOL_CATALOG) $(TEST_TOOL_CATALOG) \
$(TEST_TOOL_INITIALIZER)
.PHONY: clean run test .PHONY: clean run test

View file

@ -0,0 +1,237 @@
/******************************************************************************
* @file tool_initializer.h
* @brief Initialisation asynchrone des outils externes.
******************************************************************************/
#ifndef LABFY_INVESTIGATION_TOOL_INITIALIZER_H
#define LABFY_INVESTIGATION_TOOL_INITIALIZER_H
#include "core/background_task.h"
#include "core/task_manager.h"
#include "core/tool_registry.h"
#include <glib.h>
G_BEGIN_DECLS
/**
* @brief Représentation opaque de linitialiseur doutils.
*/
typedef struct ToolInitializer ToolInitializer;
/**
* @brief Résumé dune initialisation terminée avec succès.
*/
typedef struct
{
gsize total_count;
gsize available_count;
gsize missing_count;
gsize version_detected_count;
gsize version_failed_count;
} ToolInitializationSummary;
/**
* @brief Codes derreur de ToolInitializer.
*/
typedef enum
{
/**
* Un argument transmis au module est invalide.
*/
TOOL_INITIALIZER_ERROR_INVALID_ARGUMENT,
/**
* Une initialisation est déjà en cours.
*/
TOOL_INITIALIZER_ERROR_ALREADY_RUNNING,
/**
* Aucune initialisation nest actuellement en cours.
*/
TOOL_INITIALIZER_ERROR_NOT_RUNNING,
/**
* La tâche darrière-plan na pas pu être créée.
*/
TOOL_INITIALIZER_ERROR_TASK_CREATION,
/**
* La tâche na pas pu être ajoutée au TaskManager.
*/
TOOL_INITIALIZER_ERROR_TASK_REGISTRATION,
/**
* La tâche na pas pu être démarrée.
*/
TOOL_INITIALIZER_ERROR_TASK_START,
/**
* Le catalogue na pas pu être enregistré.
*/
TOOL_INITIALIZER_ERROR_CATALOG_REGISTRATION,
/**
* Le registre na pas pu rechercher les exécutables.
*/
TOOL_INITIALIZER_ERROR_REGISTRY_REFRESH,
/**
* Létat interne de linitialiseur est incohérent.
*/
TOOL_INITIALIZER_ERROR_INTERNAL_STATE
} ToolInitializerError;
/**
* @brief Domaine derreur du module.
*/
#define TOOL_INITIALIZER_ERROR \
tool_initializer_error_quark()
/**
* @brief Retourne le domaine derreur de ToolInitializer.
*
* @return Quark GLib du domaine derreur.
*/
GQuark tool_initializer_error_quark(void);
/**
* @brief Crée un initialiseur doutils externes.
*
* Linitialiseur :
*
* - conserve une référence empruntée vers task_manager ;
* - crée et possède son propre ToolRegistry ;
* - ne prend pas possession de task_manager.
*
* task_manager doit rester valide pendant les appels publics utilisant
* linitialiseur.
*
* @param task_manager Gestionnaire recevant la tâche dinitialisation.
* @param error Emplacement facultatif recevant une erreur.
*
* @return Nouvel initialiseur, ou NULL en cas déchec.
*/
ToolInitializer *tool_initializer_new(
TaskManager *task_manager,
GError **error
);
/**
* @brief Libère la référence détenue par lappelant.
*
* Si une initialisation est encore active, son annulation est demandée.
* La fonction ne bloque pas en attendant la fin du worker.
*
* Une référence interne conserve les ressources nécessaires jusquà la
* finalisation réelle de la tâche.
*
* La fonction accepte tool_initializer == NULL.
*
* @param tool_initializer Initialiseur à libérer.
*/
void tool_initializer_free(
ToolInitializer *tool_initializer
);
/**
* @brief Retourne le registre appartenant à linitialiseur.
*
* Le pointeur retourné est emprunté et ne doit jamais être libéré par
* lappelant.
*
* Il ne doit plus être utilisé après tool_initializer_free().
*
* @param tool_initializer Initialiseur consulté.
*
* @return Registre emprunté, ou NULL.
*/
ToolRegistry *tool_initializer_get_registry(
ToolInitializer *tool_initializer
);
/**
* @brief Démarre linitialisation en arrière-plan.
*
* La fonction :
*
* - crée une nouvelle BackgroundTask ;
* - lajoute au TaskManager ;
* - lance son worker ;
* - refuse un second démarrage tant quune tâche est active.
*
* Une nouvelle exécution peut être lancée après la fin ou lannulation
* de la précédente.
*
* @param tool_initializer Initialiseur concerné.
* @param error Emplacement facultatif recevant une erreur.
*
* @return TRUE si la tâche a é lancée, sinon FALSE.
*/
gboolean tool_initializer_start(
ToolInitializer *tool_initializer,
GError **error
);
/**
* @brief Demande lannulation de linitialisation active.
*
* Lannulation est coopérative.
*
* @param tool_initializer Initialiseur concerné.
* @param error Emplacement facultatif recevant une erreur.
*
* @return TRUE si une annulation a é demandée, sinon FALSE.
*/
gboolean tool_initializer_cancel(
ToolInitializer *tool_initializer,
GError **error
);
/**
* @brief Indique si une initialisation est en cours.
*
* @param tool_initializer Initialiseur consulté.
*
* @return TRUE si une tâche est en attente ou en cours, sinon FALSE.
*/
gboolean tool_initializer_is_running(
const ToolInitializer *tool_initializer
);
/**
* @brief Retourne une référence vers la tâche actuelle ou la dernière tâche.
*
* Lappelant devient propriétaire dune référence et doit la libérer avec :
*
* @code
* background_task_unref(task);
* @endcode
*
* @param tool_initializer Initialiseur consulté.
*
* @return Nouvelle référence vers la tâche, ou NULL.
*/
BackgroundTask *tool_initializer_get_task(
const ToolInitializer *tool_initializer
);
/**
* @brief Copie le résumé de la dernière initialisation réussie.
*
* Le résumé nest disponible que lorsque la dernière tâche sest terminée
* dans létat BACKGROUND_TASK_STATE_COMPLETED.
*
* @param tool_initializer Initialiseur consulté.
* @param out_summary Structure recevant une copie du résumé.
*
* @return TRUE si un résumé est disponible, sinon FALSE.
*/
gboolean tool_initializer_get_last_summary(
const ToolInitializer *tool_initializer,
ToolInitializationSummary *out_summary
);
G_END_DECLS
#endif

Binary file not shown.

1338
src/core/tool_initializer.c Normal file

File diff suppressed because it is too large Load diff

BIN
tests/test_tool_initializer Executable file

Binary file not shown.

File diff suppressed because it is too large Load diff