From: Antoine Pitrou Date: Sun, 30 Oct 2011 18:13:55 +0000 (+0100) Subject: Issue #10363: Deallocate global locks in Py_Finalize(). X-Git-Tag: v3.2.3rc1~456 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8db076cf8af4fddfc1e406ec579d559abc53304c;p=thirdparty%2FPython%2Fcpython.git Issue #10363: Deallocate global locks in Py_Finalize(). --- diff --git a/Misc/NEWS b/Misc/NEWS index 527874dae667..16c808c44c19 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ What's New in Python 3.2.3? Core and Builtins ----------------- +- Issue #10363: Deallocate global locks in Py_Finalize(). + - Issue #13018: Fix reference leaks in error paths in dictobject.c. Patch by Suman Saha. diff --git a/Python/import.c b/Python/import.c index 2adcb0467411..1dbe544e73aa 100644 --- a/Python/import.c +++ b/Python/import.c @@ -252,16 +252,6 @@ _PyImportHooks_Init(void) Py_DECREF(path_hooks); } -void -_PyImport_Fini(void) -{ - Py_XDECREF(extensions); - extensions = NULL; - PyMem_DEL(_PyImport_Filetab); - _PyImport_Filetab = NULL; -} - - /* Locking primitives to prevent parallel imports of the same module in different threads to return with a partially loaded module. These calls are serialized by the global interpreter lock. */ @@ -374,6 +364,21 @@ imp_release_lock(PyObject *self, PyObject *noargs) return Py_None; } +void +_PyImport_Fini(void) +{ + Py_XDECREF(extensions); + extensions = NULL; + PyMem_DEL(_PyImport_Filetab); + _PyImport_Filetab = NULL; +#ifdef WITH_THREAD + if (import_lock != NULL) { + PyThread_free_lock(import_lock); + import_lock = NULL; + } +#endif +} + static void imp_modules_reloading_clear(void) { diff --git a/Python/pystate.c b/Python/pystate.c index b347c41c54a5..40699af49949 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -150,6 +150,12 @@ PyInterpreterState_Delete(PyInterpreterState *interp) *p = interp->next; HEAD_UNLOCK(); free(interp); +#ifdef WITH_THREAD + if (interp_head == NULL && head_mutex != NULL) { + PyThread_free_lock(head_mutex); + head_mutex = NULL; + } +#endif }