From d419908c21172b72e7782f460f385b33ad85f929 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Wed, 2 May 2018 12:03:07 +0200 Subject: Cleaned some archive resources at exit. --- src/analysis/db/cdb.c | 31 ++++++++++++++++++++++++++++++- src/analysis/db/server.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 74 insertions(+), 3 deletions(-) diff --git a/src/analysis/db/cdb.c b/src/analysis/db/cdb.c index 14ea5c7..e909210 100644 --- a/src/analysis/db/cdb.c +++ b/src/analysis/db/cdb.c @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -253,10 +254,38 @@ static void g_cdb_archive_dispose(GCdbArchive *archive) static void g_cdb_archive_finalize(GCdbArchive *archive) { - //void close_xml_file(xmlDocPtr, xmlXPathContextPtr); + int ret; /* Bilan d'un appel */ + + if (archive->db != NULL) + { + ret = sqlite3_close(archive->db); + assert(ret == SQLITE_OK); + } + + if (archive->xdoc != NULL) + close_xml_file(archive->xdoc, archive->context); + + if (archive->xml_desc != NULL) + { + ret = unlink(archive->xml_desc); + if (ret != 0) perror("unlink"); + + free(archive->xml_desc); + + } + + if (archive->sql_db != NULL) + { + ret = unlink(archive->sql_db); + if (ret != 0) perror("unlink"); + + free(archive->sql_db); + + } free(archive->filename); + exit_rle_string(&archive->hash); G_OBJECT_CLASS(g_cdb_archive_parent_class)->finalize(G_OBJECT(archive)); diff --git a/src/analysis/db/server.c b/src/analysis/db/server.c index 0debd83..f6c7a71 100644 --- a/src/analysis/db/server.c +++ b/src/analysis/db/server.c @@ -107,6 +107,9 @@ static void g_db_server_class_init(GDbServerClass *); /* Initialise une description de fichier binaire. */ static void g_db_server_init(GDbServer *); +/* Supprime toutes les références externes. */ +static void g_db_server_dispose(GDbServer *); + /* Procède à la libération totale de la mémoire. */ static void g_db_server_finalize(GDbServer *); @@ -149,6 +152,7 @@ static void g_db_server_class_init(GDbServerClass *klass) object = G_OBJECT_CLASS(klass); + object->dispose = (GObjectFinalizeFunc/* ! */)g_db_server_dispose; object->finalize = (GObjectFinalizeFunc)g_db_server_finalize; } @@ -179,6 +183,37 @@ static void g_db_server_init(GDbServer *server) /****************************************************************************** * * +* Paramètres : archive = instance d'objet GLib à traiter. * +* * +* Description : Supprime toutes les références externes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_db_server_dispose(GDbServer *server) +{ + GList *iter; /* Boucle de parcours */ + + for (iter = g_list_first(server->archives); + iter != NULL; + iter = g_list_first(server->archives)) + { + g_object_unref(G_OBJECT(iter->data)); + server->archives = g_list_delete_link(server->archives, iter); + } + + g_mutex_clear(&server->mutex); + + G_OBJECT_CLASS(g_db_server_parent_class)->dispose(G_OBJECT(server)); + +} + + +/****************************************************************************** +* * * Paramètres : server = instance d'objet GLib à traiter. * * * * Description : Procède à la libération totale de la mémoire. * @@ -740,7 +775,7 @@ static void *g_db_server_listener(GDbServer *server) if (!status) goto gdsl_out_error; /** - * L'ajout dans la liste des clients connectés provoque un envoie de mises à jour. + * L'ajout dans la liste des clients connectés provoque un envoi de mises à jour. * L'éventuelle erreur survenant pendant l'envoi ne peut donc pas être remontée * lors des échanges initiaux, car ces derniers seraient alors précédés des mises à jour... */ @@ -749,7 +784,10 @@ static void *g_db_server_listener(GDbServer *server) { assert(error == DBE_NONE); - server->archives = g_list_append(server->archives, archive); + /* Si l'archive a été créée pour l'occasion... */ + if (iter == NULL) + server->archives = g_list_append(server->archives, archive); + error = g_cdb_archive_add_client(archive, fd, &user); exit_packed_buffer(&out_pbuf); @@ -769,6 +807,10 @@ static void *g_db_server_listener(GDbServer *server) exit_packed_buffer(&out_pbuf); + /* Si l'archive a été créée pour l'occasion... */ + if (iter == NULL && archive != NULL) + g_object_unref(G_OBJECT(archive)); + gdsl_error: free(peer_name); -- cgit v0.11.2-87-g4458