diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2025-01-16 01:00:28 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2025-01-16 01:00:28 (GMT) |
commit | 64b690f0038e01e807c1ec8d62041057fd38b4b8 (patch) | |
tree | 1de592f2379547abfb8aedc452958dbdace9b658 /plugins/pychrysalide/core.c | |
parent | 8be5b3fb8a516380fc88fd900a98238ce8564682 (diff) |
Improve the plugins management.gtk4
Diffstat (limited to 'plugins/pychrysalide/core.c')
-rw-r--r-- | plugins/pychrysalide/core.c | 42 |
1 files changed, 40 insertions, 2 deletions
diff --git a/plugins/pychrysalide/core.c b/plugins/pychrysalide/core.c index fde1028..0e72b46 100644 --- a/plugins/pychrysalide/core.c +++ b/plugins/pychrysalide/core.c @@ -390,16 +390,53 @@ static bool g_pychrysalide_plugin_enable(GPyChrysalidePlugin *plugin) static bool g_pychrysalide_plugin_disable(GPyChrysalidePlugin *plugin) { + bool result; /* Bilan à retourner */ + bool standalone; /* Nature du chargement */ PyGILState_STATE gstate; /* Sauvegarde d'environnement */ - gstate = PyGILState_Ensure(); + result = true; + + /** + * Le champ plugin->py_module n'est défini que via la fonction + * g_pychrysalide_plugin_enable(), qui n'est pas sollicitée lorsque + * le module PyChrysalide est mis en place directement par Python. + * + * L'analyse de ce champ pour retrouver la situation courante est + * plus fiable que celle du champ _standalone, potentiellement + * cohérent dans la version UI du greffon et resté à son état + * initial ici. + */ + + standalone = (plugin->py_module == NULL); + + /** + * Si on se trouve embarqué dans un interpréteur Python, le déchargement + * des greffons est organisé à partir de la fonction PyExit_pychrysalide(), + * directement appelée depuis un contexte Python. + * + * Un verrou n'est alors pas souhaité ici : + * + * python3d: ../Python/pystate.c:1687: PyGILState_Ensure: Assertion `gilstate->autoInterpreterState' failed. + * + * Avec : + * + * $ python3d --version + * Python 3.11.2 + * + */ + + if (!standalone) + gstate = PyGILState_Ensure(); clear_all_accesses_to_python_modules(); Py_XDECREF(plugin->py_module); plugin->py_module = NULL; - PyGILState_Release(gstate); + if (!standalone) + PyGILState_Release(gstate); + + return result; } @@ -720,6 +757,7 @@ PyMODINIT_FUNC PyInit_pychrysalide(void) details.standalone = _standalone; details.populate_extra = NULL; + details.create_self = g_pychrysalide_plugin_new; result = init_python_pychrysalide_module(&details); |