From de62d34d2dc6135b42af7f8a103c8c7af09fd54f Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Wed, 25 Oct 2017 21:53:25 +0200 Subject: Ensured the Python modules are available for other plugins in standalone mode. --- ChangeLog | 15 ++++++++++++++ plugins/pychrysa/pychrysa.c | 48 ++++++++++++++++++++++++++++++++++++++++++++- plugins/pychrysa/pychrysa.h | 3 +++ src/main.c | 2 +- src/plugins/pglist.c | 29 ++++++++++++++++++++++++--- src/plugins/pglist.h | 8 +++++++- src/plugins/plugin.c | 22 ++++++++++++++++++++- src/plugins/plugin.h | 3 +++ 8 files changed, 123 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 671d873..eb5c3c2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,20 @@ 17-10-25 Cyrille Bagard + * plugins/pychrysa/pychrysa.c: + * plugins/pychrysa/pychrysa.h: + Ensure the Python modules are available for other plugins in standalone mode. + + * src/main.c: + Update code. + + * src/plugins/pglist.c: + * src/plugins/pglist.h: + * src/plugins/plugin.c: + * src/plugins/plugin.h: + Extend the features for the fix. + +17-10-25 Cyrille Bagard + * plugins/dalvik/core.c: * plugins/dalvik/core.h: * plugins/dalvik/register.c: diff --git a/plugins/pychrysa/pychrysa.c b/plugins/pychrysa/pychrysa.c index 7c082d6..c971e56 100644 --- a/plugins/pychrysa/pychrysa.c +++ b/plugins/pychrysa/pychrysa.c @@ -24,6 +24,7 @@ #include "pychrysa.h" +#include #include #include #include @@ -62,6 +63,9 @@ DEFINE_CHRYSALIDE_ACTIVE_PLUGIN("PyChrysalide", "Provides bindings to Python", " /* Note la nature du chargement */ static bool _standalone = true; +/* Réceptacle pour le chargement forcé */ +static PyObject *_chrysalide_module = NULL; + /* Fournit la révision du programme global. */ static PyObject *py_chrysalide_revision(PyObject *, PyObject *); @@ -299,6 +303,8 @@ PyMODINIT_FUNC PyInit_pychrysalide(void) { PyObject *result; /* Module Python à retourner */ bool status; /* Bilan des inclusions */ + GPluginModule *self; /* Représentation interne */ + PluginStatusFlags self_flags; /* Fanions à mettre à jour */ static PyMethodDef py_chrysalide_methods[] = { @@ -400,7 +406,25 @@ PyMODINIT_FUNC PyInit_pychrysalide(void) } if (_standalone) - init_all_plugins(); + { + init_all_plugins(false); + + lock_plugin_list_for_reading(); + + self = get_plugin_by_name("PyChrysalide", NULL); + assert(self != NULL); + + self_flags = g_plugin_module_get_flags(self); + self_flags &= ~(PSF_FAILURE | PSF_LOADED); + self_flags |= (status ? PSF_LOADED : PSF_FAILURE); + + g_plugin_module_override_flags(self, self_flags); + + unlock_plugin_list_for_reading(); + + load_remaning_plugins(); + + } return result; @@ -556,6 +580,8 @@ G_MODULE_EXPORT bool chrysalide_plugin_init(GPluginModule *plugin) PySys_SetArgv(0, (wchar_t *[]) { NULL }); + _chrysalide_module = PyImport_ImportModule("pychrysalide"); + result = load_python_plugins(plugin); cpi_done: @@ -563,3 +589,23 @@ G_MODULE_EXPORT bool chrysalide_plugin_init(GPluginModule *plugin) return result; } + + + +/****************************************************************************** +* * +* Paramètres : plugin = greffon à manipuler. * +* * +* Description : Prend acte du déchargement du greffon. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +G_MODULE_EXPORT void chrysalide_plugin_exit(GPluginModule *plugin) +{ + Py_XDECREF(_chrysalide_module); + +} diff --git a/plugins/pychrysa/pychrysa.h b/plugins/pychrysa/pychrysa.h index 51d0470..eb8fc5b 100644 --- a/plugins/pychrysa/pychrysa.h +++ b/plugins/pychrysa/pychrysa.h @@ -91,6 +91,9 @@ PyMODINIT_FUNC PyInit_pychrysalide(void); /* Prend acte du chargement du greffon. */ G_MODULE_EXPORT bool chrysalide_plugin_init(GPluginModule *); +/* Prend acte du déchargement du greffon. */ +G_MODULE_EXPORT void chrysalide_plugin_exit(GPluginModule *); + #endif /* _PLUGINS_PYCHRYSA_H */ diff --git a/src/main.c b/src/main.c index 3bcedf4..e05ccb6 100644 --- a/src/main.c +++ b/src/main.c @@ -249,7 +249,7 @@ int main(int argc, char **argv) if (!batch_mode) gtk_widget_show_now(editor); - init_all_plugins(); + init_all_plugins(true); config = get_main_configuration(); diff --git a/src/plugins/pglist.c b/src/plugins/pglist.c index 2010cda..1f608b4 100644 --- a/src/plugins/pglist.c +++ b/src/plugins/pglist.c @@ -58,7 +58,7 @@ static void browse_directory_for_plugins(const char *); /****************************************************************************** * * -* Paramètres : - * +* Paramètres : load = procéde à un chargement dans la foulée ? * * * * Description : Procède au chargement des différents greffons trouvés. * * * @@ -68,13 +68,14 @@ static void browse_directory_for_plugins(const char *); * * ******************************************************************************/ -bool init_all_plugins(void) +bool init_all_plugins(bool load) { g_rw_lock_init(&_pg_lock); browse_directory_for_plugins(PACKAGE_SOURCE_DIR "/plugins"); - load_remaning_plugins(); + if (load) + load_remaning_plugins(); return true; @@ -113,6 +114,28 @@ void exit_all_plugins(void) /****************************************************************************** * * +* Paramètres : lock = type d'action à mener. * +* * +* Description : Verrouille ou déverrouille l'accès en lecture à la liste. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void _lock_unlock_plugin_list_for_reading(bool lock) +{ + if (lock) + g_rw_lock_reader_lock(&_pg_lock); + else + g_rw_lock_reader_unlock(&_pg_lock); + +} + + +/****************************************************************************** +* * * 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 d2f2243..d406cc8 100644 --- a/src/plugins/pglist.h +++ b/src/plugins/pglist.h @@ -36,11 +36,17 @@ /* Procède au chargement des différents greffons trouvés. */ -bool init_all_plugins(void); +bool init_all_plugins(bool); /* Procède au déchargement des différents greffons présents. */ void exit_all_plugins(void); +/* Verrouille ou déverrouille l'accès en lecture à la liste. */ +void _lock_unlock_plugin_list_for_reading(bool lock); + +#define lock_plugin_list_for_reading() _lock_unlock_plugin_list_for_reading(true) +#define unlock_plugin_list_for_reading() _lock_unlock_plugin_list_for_reading(false) + /* Ajoute un greffon à la liste principale de greffons. */ void _register_plugin(GPluginModule *); diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c index a57cb6f..2cfb3de 100644 --- a/src/plugins/plugin.c +++ b/src/plugins/plugin.c @@ -391,6 +391,26 @@ PluginStatusFlags g_plugin_module_get_flags(const GPluginModule *plugin) /****************************************************************************** * * +* Paramètres : plugin = greffon à modifier. * +* flags = fanions à ajouter brutalement au greffon. * +* * +* Description : Ajoute des indications sur l'état du greffon. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_plugin_module_override_flags(GPluginModule *plugin, PluginStatusFlags flags) +{ + plugin->flags |= flags; + +} + + +/****************************************************************************** +* * * Paramètres : plugin = greffon à mettre à jour. * * list = ensemble des greffons disponibles. * * count = taille de cet ensemble. * @@ -543,7 +563,7 @@ bool g_plugin_module_load(GPluginModule *plugin, GPluginModule **list, size_t co plugin->flags |= PSF_FAILURE; - } + } } diff --git a/src/plugins/plugin.h b/src/plugins/plugin.h index 78dcaa6..d86682c 100644 --- a/src/plugins/plugin.h +++ b/src/plugins/plugin.h @@ -82,6 +82,9 @@ const plugin_interface *g_plugin_module_get_interface(const GPluginModule *); /* Fournit des indications sur l'état du greffon. */ PluginStatusFlags g_plugin_module_get_flags(const GPluginModule *); +/* Ajoute des indications sur l'état du greffon. */ +void g_plugin_module_override_flags(GPluginModule *, PluginStatusFlags); + /* Met à jour l'ensemble des dépendances du greffon. */ bool g_plugin_module_resolve_dependencies(GPluginModule *, GPluginModule **, size_t); -- cgit v0.11.2-87-g4458