diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2021-01-03 15:12:38 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2021-01-03 15:12:38 (GMT) |
commit | e790ebee8ad78e91fc61738c5c40062ed36b1d44 (patch) | |
tree | ec9cbd3f383038ebf35a11037a170150dcfacaf3 /plugins/pychrysalide/core.c | |
parent | dcd5e0b104143b110997029aa0728731f4087ad8 (diff) |
Fixed a memory leak when a Python plugin fails to load.
Diffstat (limited to 'plugins/pychrysalide/core.c')
-rw-r--r-- | plugins/pychrysalide/core.c | 31 |
1 files changed, 11 insertions, 20 deletions
diff --git a/plugins/pychrysalide/core.c b/plugins/pychrysalide/core.c index a148654..7bc46e4 100644 --- a/plugins/pychrysalide/core.c +++ b/plugins/pychrysalide/core.c @@ -664,6 +664,7 @@ static void load_python_plugins(GPluginModule *plugin) struct dirent *entry; /* Elément trouvé */ char *modname; /* Nom du module pour Python */ char *filename; /* Chemin d'accès reconstruit */ + PyThreadState *tstate; /* Contexte d'environnement */ GPluginModule *pyplugin; /* Lien vers un grffon Python */ bool status; /* Bilan d'une opération */ GGenConfig *config; /* Configuration à charger */ @@ -743,8 +744,17 @@ static void load_python_plugins(GPluginModule *plugin) filename = stradd(filename, G_DIR_SEPARATOR_S); filename = stradd(filename, entry->d_name); + if (!_standalone) + { + tstate = get_pychrysalide_main_tstate(); + PyEval_RestoreThread(tstate); + } + pyplugin = g_python_plugin_new(modname, filename); + if (!_standalone) + PyEval_SaveThread(); + if (pyplugin == NULL) { g_plugin_module_log_variadic_message(plugin, LMT_ERROR, @@ -761,6 +771,7 @@ static void load_python_plugins(GPluginModule *plugin) { g_plugin_module_log_variadic_message(plugin, LMT_ERROR, _("Plugin '%s' failed to complete loading..."), filename); + g_object_unref(G_OBJECT(pyplugin)); goto done_with_plugin; } @@ -772,12 +783,6 @@ static void load_python_plugins(GPluginModule *plugin) _("Loaded the Python plugin found in the '<b>%s</b>' directory"), filename); - /** - * Comme le greffon n'est pas passé par la résolution des dépendances, - * on simule l'effet attendu. - */ - g_object_ref(G_OBJECT(plugin)); - _register_plugin(pyplugin); done_with_plugin: @@ -894,23 +899,9 @@ G_MODULE_EXPORT void chrysalide_plugin_exit(GPluginModule *plugin) G_MODULE_EXPORT void chrysalide_plugin_on_plugins_loaded(GPluginModule *plugin, PluginAction action) { - PyThreadState *tstate; /* Contexte d'environnement */ - if (action == PGA_NATIVE_PLUGINS_LOADED) - { - if (!_standalone) - { - tstate = get_pychrysalide_main_tstate(); - PyEval_RestoreThread(tstate); - } - load_python_plugins(plugin); - if (!_standalone) - PyEval_SaveThread(); - - } - } |