summaryrefslogtreecommitdiff
path: root/src/plugins
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 /src/plugins
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
Diffstat (limited to 'src/plugins')
-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
4 files changed, 109 insertions, 6 deletions
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;
+
/*