summaryrefslogtreecommitdiff
path: root/plugins/pychrysalide/core.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2025-01-16 01:00:28 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2025-01-16 01:00:28 (GMT)
commit64b690f0038e01e807c1ec8d62041057fd38b4b8 (patch)
tree1de592f2379547abfb8aedc452958dbdace9b658 /plugins/pychrysalide/core.c
parent8be5b3fb8a516380fc88fd900a98238ce8564682 (diff)
Improve the plugins management.gtk4
Diffstat (limited to 'plugins/pychrysalide/core.c')
-rw-r--r--plugins/pychrysalide/core.c42
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);