Mercurial > cpython-lru_cache-weakref
diff Modules/atexitmodule.c @ 41294:ef70cd4dba50
Address some XXXs from Neal Norwitz.
| author | Collin Winter <collinw@gmail.com> |
|---|---|
| date | Fri, 23 Mar 2007 22:46:49 +0000 |
| parents | 8812718669e1 |
| children | 229361198e8d |
line wrap: on
line diff
--- a/Modules/atexitmodule.c Wed Mar 21 22:26:20 2007 +0000 +++ b/Modules/atexitmodule.c Fri Mar 23 22:46:49 2007 +0000 @@ -8,6 +8,9 @@ #include "Python.h" +/* Forward declaration (for atexit_cleanup) */ +static PyObject *atexit_clear(PyObject*); + /* ===================================================================== */ /* Callback machinery. */ @@ -72,6 +75,13 @@ PyMem_Free(cb); } +void +atexit_cleanup(void) +{ + PyObject *r = atexit_clear(NULL); + Py_DECREF(r); +} + /* ===================================================================== */ /* Module methods. */ @@ -93,12 +103,13 @@ PyObject *func = NULL; if (ncallbacks >= callback_len) { + atexit_callback **r; callback_len += 16; - /* XXX(nnorwitz): this leaks if realloc() fails. It also - doesn't verify realloc() returns a valid (non-NULL) pointer. */ - atexit_callbacks = PyMem_Realloc(atexit_callbacks, - sizeof(atexit_callback*) * callback_len); - + r = (atexit_callback**)PyMem_Realloc(atexit_callbacks, + sizeof(atexit_callback*) * callback_len); + if (r == NULL) + return PyErr_NoMemory(); + atexit_callbacks = r; } if (PyTuple_GET_SIZE(args) == 0) { @@ -217,8 +228,8 @@ if (m == NULL) return; - /* XXX(nnorwitz): probably best to register a callback that will free - atexit_callbacks, otherwise valgrind will report memory leaks. - Need to call atexit_clear() first. */ _Py_PyAtExit(atexit_callfuncs); + /* Register a callback that will free + atexit_callbacks, otherwise valgrind will report memory leaks. */ + Py_AtExit(atexit_cleanup); }
