From 4983415699a341c3bb21d96bf413c2938cba450d Mon Sep 17 00:00:00 2001 From: Sven Trenkel Date: Mon, 15 Aug 2016 18:55:44 +0000 Subject: [PATCH] python plugin: Unregister all internal callback lists before Python interpreter shutdown. --- src/python.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/python.c b/src/python.c index a555734f..94058421 100644 --- a/src/python.c +++ b/src/python.c @@ -805,8 +805,8 @@ static PyObject *cpy_unregister_generic(cpy_callback_t **list_head, PyObject *ar PyErr_Format(PyExc_RuntimeError, "Unable to unregister %s callback '%s'.", desc, name); return NULL; } - /* Yes, this is actually save. To call this function the caller has to - * hold the GIL. Well, save as long as there is only one GIL anyway ... */ + /* Yes, this is actually safe. To call this function the caller has to + * hold the GIL. Well, safe as long as there is only one GIL anyway ... */ if (prev == NULL) *list_head = tmp->next; else @@ -815,6 +815,15 @@ static PyObject *cpy_unregister_generic(cpy_callback_t **list_head, PyObject *ar Py_RETURN_NONE; } +static void cpy_unregister_list(cpy_callback_t **list_head) { + cpy_callback_t *cur, *next; + for (cur = *list_head; cur; cur = next) { + next = cur->next; + cpy_destroy_user_data(cur); + } + *list_head = NULL; +} + typedef int cpy_unregister_function_t(const char *name); static PyObject *cpy_unregister_generic_userdata(cpy_unregister_function_t *unreg, PyObject *arg, const char *desc) { @@ -916,6 +925,11 @@ static int cpy_shutdown(void) { Py_DECREF(ret); } PyErr_Print(); + + cpy_unregister_list(&cpy_config_callbacks); + cpy_unregister_list(&cpy_init_callbacks); + cpy_unregister_list(&cpy_shutdown_callbacks); + Py_Finalize(); return 0; } @@ -949,7 +963,7 @@ static void *cpy_interactive(void *data) { if (PyImport_ImportModule("readline") == NULL) { /* This interactive session will suck. */ cpy_log_exception("interactive session init"); - } + } cur_sig = PyOS_setsig(SIGINT, python_sigint_handler); /* We totally forked just now. Everyone saw that, right? */ PyOS_AfterFork(); -- 2.11.0