[Python-3000-checkins] r54557 - python/branches/p3yk/Modules/atexitmodule.c

collin.winter python-3000-checkins at python.org
Fri Mar 23 23:46:49 CET 2007


Author: collin.winter
Date: Fri Mar 23 23:46:49 2007
New Revision: 54557

Modified:
   python/branches/p3yk/Modules/atexitmodule.c
Log:
Address some XXXs from Neal Norwitz.

Modified: python/branches/p3yk/Modules/atexitmodule.c
==============================================================================
--- python/branches/p3yk/Modules/atexitmodule.c	(original)
+++ python/branches/p3yk/Modules/atexitmodule.c	Fri Mar 23 23:46:49 2007
@@ -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);
 }


More information about the Python-3000-checkins mailing list