diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2012-12-21 12:54:17 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2012-12-21 12:54:17 (GMT) |
commit | 0cfcbee3c536ac6d11ec806d47ce4c136f695697 (patch) | |
tree | ffe4164a1337922e66c2ed024eeb6d407ab76d59 /src/plugins/plugin.c | |
parent | cf9ea46a796000f0252bb7d80c0ac0fb170e156a (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/plugin.c')
-rw-r--r-- | src/plugins/plugin.c | 80 |
1 files changed, 74 insertions, 6 deletions
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; + /* |