From: Christian McDonald Date: Fri, 13 Jan 2023 21:39:28 +0000 (-0500) Subject: eliminate unnecessary Python reloading which causes memory leaks X-Git-Tag: release-1.18.0rc1~24^2~20^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cfd3bcb21eeec8b81ea41f706b6bdb87ac034b1a;p=thirdparty%2Funbound.git eliminate unnecessary Python reloading which causes memory leaks --- diff --git a/pythonmod/pythonmod.c b/pythonmod/pythonmod.c index 28ce0eec4..19b464633 100644 --- a/pythonmod/pythonmod.c +++ b/pythonmod/pythonmod.c @@ -252,6 +252,16 @@ cleanup: Py_XDECREF(exc_tb); } +/* we only want to unwind Python once at exit */ +void pythonmod_atexit(void) +{ + assert(py_mod_count == 0); + assert(maimthr != NULL); + + PyEval_RestoreThread(mainthr); + Py_Finalize(); +} + int pythonmod_init(struct module_env* env, int id) { int py_mod_idx = py_mod_count++; @@ -310,6 +320,9 @@ int pythonmod_init(struct module_env* env, int id) #endif SWIG_init(); mainthr = PyEval_SaveThread(); + + /* XXX: register callback to unwind Python at exit */ + atexit(pythonmod_atexit); } gil = PyGILState_Ensure(); @@ -547,11 +560,7 @@ void pythonmod_deinit(struct module_env* env, int id) Py_XDECREF(pe->data); PyGILState_Release(gil); - if(--py_mod_count==0) { - PyEval_RestoreThread(mainthr); - Py_Finalize(); - mainthr = NULL; - } + py_mod_count--; } pe->fname = NULL; free(pe);