summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2012-12-21 12:54:17 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2012-12-21 12:54:17 (GMT)
commit0cfcbee3c536ac6d11ec806d47ce4c136f695697 (patch)
treeffe4164a1337922e66c2ed024eeb6d407ab76d59
parentcf9ea46a796000f0252bb7d80c0ac0fb170e156a (diff)
Unloaded loaded plugins and (started to) avoid memory leaks.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@307 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
-rw-r--r--ChangeLog16
-rw-r--r--configure.ac9
-rw-r--r--plugins/pychrysa/pychrysa.c21
-rw-r--r--plugins/pychrysa/pychrysa.h3
-rw-r--r--src/main.c2
-rw-r--r--src/plugins/pglist.c28
-rw-r--r--src/plugins/pglist.h3
-rw-r--r--src/plugins/plugin-int.h4
-rw-r--r--src/plugins/plugin.c80
9 files changed, 156 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index bc095d6..a0579f3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+12-12-21 Cyrille Bagard <nocbos@gmail.com>
+
+ * configure.ac:
+ Use Python debug libraries in debug mode.
+
+ * plugins/pychrysa/pychrysa.c:
+ * plugins/pychrysa/pychrysa.h:
+ Update.
+
+ * src/main.c:
+ * src/plugins/pglist.c:
+ * src/plugins/pglist.h:
+ * src/plugins/plugin.c:
+ * src/plugins/plugin-int.h:
+ Unload loaded plugins and (start to) avoid memory leaks.
+
12-12-19 Cyrille Bagard <nocbos@gmail.com>
* src/analysis/binaries/file.c:
diff --git a/configure.ac b/configure.ac
index c1df58c..5658e46 100644
--- a/configure.ac
+++ b/configure.ac
@@ -188,8 +188,13 @@ AC_SUBST(LIBXML_LIBS)
#--- Checks for Python
-LIBPYTHON_CFLAGS=`python-config --cflags`
-LIBPYTHON_LIBS=`python-config --libs`
+if test "x$enable_debug" = "xyes"; then
+ LIBPYTHON_CFLAGS=`python-dbg-config --cflags`
+ LIBPYTHON_LIBS=`python-dbg-config --libs`
+else
+ LIBPYTHON_CFLAGS=`python-config --cflags`
+ LIBPYTHON_LIBS=`python-config --libs`
+fi
AC_SUBST(LIBPYTHON_CFLAGS)
AC_SUBST(LIBPYTHON_LIBS)
diff --git a/plugins/pychrysa/pychrysa.c b/plugins/pychrysa/pychrysa.c
index d7cdfe4..0e8446d 100644
--- a/plugins/pychrysa/pychrysa.c
+++ b/plugins/pychrysa/pychrysa.c
@@ -180,8 +180,6 @@ bool init_plugin(GPluginModule *plugin, GObject *ref)
}
- //Py_Finalize();
-
return true;
}
@@ -189,6 +187,25 @@ bool init_plugin(GPluginModule *plugin, GObject *ref)
/******************************************************************************
* *
+* Paramètres : plugin = instance représentant le greffon en déchargement. *
+* *
+* Description : Libère le greffon permettant l'usage de Python. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void exit_plugin(GPluginModule *plugin)
+{
+ Py_Finalize();
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : plugin = greffon à consulter. *
* *
* Description : Indique les opérations offertes par un greffon donné. *
diff --git a/plugins/pychrysa/pychrysa.h b/plugins/pychrysa/pychrysa.h
index daa0ccf..4145f11 100644
--- a/plugins/pychrysa/pychrysa.h
+++ b/plugins/pychrysa/pychrysa.h
@@ -40,6 +40,9 @@ char *get_plugin_name(void);
/* Initialise le greffon permettant l'usage de Python. */
bool init_plugin(GPluginModule *, GObject *);
+/* Libère le greffon permettant l'usage de Python. */
+void exit_plugin(GPluginModule *);
+
/* Indique les opérations offertes par un greffon donné. */
PluginAction get_plugin_action(const GPluginModule *);
diff --git a/src/main.c b/src/main.c
index 8612b1d..9efc94d 100644
--- a/src/main.c
+++ b/src/main.c
@@ -164,6 +164,8 @@ int main(int argc, char **argv)
gtk_main();
gdk_threads_leave();
+ exit_all_plugins();
+
exit_global_pango_context();
unload_configuration(config);
diff --git a/src/plugins/pglist.c b/src/plugins/pglist.c
index 6b51690..e7a3ab0 100644
--- a/src/plugins/pglist.c
+++ b/src/plugins/pglist.c
@@ -76,6 +76,7 @@ void browse_directory_for_plugins(plugins_list *, const char *);
bool init_all_plugins(GObject *ref)
{
_list.ref = ref;
+ g_object_ref(ref);
browse_directory_for_plugins(&_list, PACKAGE_SOURCE_DIR "/plugins");
@@ -86,6 +87,33 @@ bool init_all_plugins(GObject *ref)
/******************************************************************************
* *
+* Paramètres : - *
+* *
+* Description : Procède au déchargement des différents greffons présents. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void exit_all_plugins(void)
+{
+ size_t i; /* Boucle de parcours */
+
+ for (i = 0; i < _list.plugins_count; i++)
+ g_object_unref(_list.plugins[i]);
+
+ if (_list.plugins != NULL)
+ free(_list.plugins);
+
+ g_object_unref(_list.ref);
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : entry = entrée de répertoire à analyser. *
* *
* Description : Filtre les répertoire et les modules de greffons pootentels. *
diff --git a/src/plugins/pglist.h b/src/plugins/pglist.h
index e77bc8b..8e95050 100644
--- a/src/plugins/pglist.h
+++ b/src/plugins/pglist.h
@@ -38,6 +38,9 @@
/* Procède au chargement des différents greffons trouvés. */
bool init_all_plugins(GObject *);
+/* Procède au déchargement des différents greffons présents. */
+void exit_all_plugins(void);
+
/* Founit un greffon offrant le service demandé. */
GPluginModule *get_one_plugin_for_action(PluginAction);
diff --git a/src/plugins/plugin-int.h b/src/plugins/plugin-int.h
index 055f6ff..20d9720 100644
--- a/src/plugins/plugin-int.h
+++ b/src/plugins/plugin-int.h
@@ -40,6 +40,9 @@ typedef char * (* get_plugin_name_fc) (void);
/* Procède à l'initialisation du greffon. */
typedef bool (* init_plugin_fc) (GPluginModule *, GObject *);
+/* Procède à l'extinction du greffon. */
+typedef void (* exit_plugin_fc) (GPluginModule *);
+
/* Fournit une indication sur le type d'opération(s) menée(s). */
typedef PluginAction (* get_plugin_action_fc) (const GPluginModule *);
@@ -65,6 +68,7 @@ struct _GPluginModule
PluginType type; /* Type(s) du greffon */
init_plugin_fc init; /* Procédure d'initialisation */
+ exit_plugin_fc exit; /* Procédure d'extinction */
get_plugin_action_fc get_action; /* Opération(s) menée(s) */
is_matching_fc is_matching; /* Recherche de correspondance */
diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c
index dabe493..968cf65 100644
--- a/src/plugins/plugin.c
+++ b/src/plugins/plugin.c
@@ -44,6 +44,11 @@ static void g_plugin_module_class_init(GPluginModuleClass *);
/* Initialise une instance de greffon. */
static void g_plugin_module_init(GPluginModule *);
+/* Supprime toutes les références externes. */
+static void g_plugin_module_dispose(GPluginModule *);
+
+/* Procède à la libération totale de la mémoire. */
+static void g_plugin_module_finalize(GPluginModule *);
/* Indique le type défini pour un greffon. */
@@ -53,7 +58,7 @@ G_DEFINE_TYPE(GPluginModule, g_plugin_module, G_TYPE_OBJECT);
/******************************************************************************
* *
-* Paramètres : klass = classe à initialiser. *
+* Paramètres : class = classe à initialiser. *
* *
* Description : Initialise la classe des greffons. *
* *
@@ -63,15 +68,21 @@ G_DEFINE_TYPE(GPluginModule, g_plugin_module, G_TYPE_OBJECT);
* *
******************************************************************************/
-static void g_plugin_module_class_init(GPluginModuleClass *klass)
+static void g_plugin_module_class_init(GPluginModuleClass *class)
{
+ GObjectClass *object; /* Autre version de la classe */
+
+ object = G_OBJECT_CLASS(class);
+
+ object->dispose = (GObjectFinalizeFunc/* ! */)g_plugin_module_dispose;
+ object->finalize = (GObjectFinalizeFunc)g_plugin_module_finalize;
}
/******************************************************************************
* *
-* Paramètres : line = instance à initialiser. *
+* Paramètres : plugin = instance à initialiser. *
* *
* Description : Initialise une instance de greffon. *
* *
@@ -81,8 +92,57 @@ static void g_plugin_module_class_init(GPluginModuleClass *klass)
* *
******************************************************************************/
-static void g_plugin_module_init(GPluginModule *line)
+static void g_plugin_module_init(GPluginModule *plugin)
+{
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : plugin = instance d'objet GLib à traiter. *
+* *
+* Description : Supprime toutes les références externes. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_plugin_module_dispose(GPluginModule *plugin)
+{
+ if (plugin->exit != NULL)
+ plugin->exit(plugin);
+
+ if (plugin->module != NULL)
+ g_module_close(plugin->module);
+
+ G_OBJECT_CLASS(g_plugin_module_parent_class)->dispose(G_OBJECT(plugin));
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : plugin = instance d'objet GLib à traiter. *
+* *
+* Description : Procède à la libération totale de la mémoire. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_plugin_module_finalize(GPluginModule *plugin)
{
+ if (plugin->name != NULL)
+ free(plugin->name);
+ if (plugin->filename != NULL)
+ free(plugin->filename);
+
+ G_OBJECT_CLASS(g_plugin_module_parent_class)->finalize(G_OBJECT(plugin));
}
@@ -109,9 +169,14 @@ GPluginModule *g_plugin_module_new(const gchar *filename)
result = g_object_new(G_TYPE_PLUGIN_MODULE, NULL);
-
result->module = g_module_open(filename, G_MODULE_BIND_LAZY);
- if (!result->module) goto bad_plugin;
+ if (result->module == NULL)
+ {
+ log_variadic_message(LMT_ERROR,
+ _("Error while loading the plugin candidate '%s' : %s"),
+ filename, g_module_error());
+ goto bad_plugin;
+ }
if (!g_module_symbol(result->module, "get_plugin_name", (gpointer *)&get_name))
{
@@ -127,6 +192,9 @@ GPluginModule *g_plugin_module_new(const gchar *filename)
if (!g_module_symbol(result->module, "init_plugin", (gpointer *)&result->init))
result->init = NULL;
+ if (!g_module_symbol(result->module, "exit_plugin", (gpointer *)&result->exit))
+ result->exit = NULL;
+
/*