[Python-3000-checkins] r54478 - in python/branches/p3yk: Modules/atexitmodule.c PC/config.c

neal.norwitz python-3000-checkins at python.org
Wed Mar 21 05:45:14 CET 2007


Author: neal.norwitz
Date: Wed Mar 21 05:45:04 2007
New Revision: 54478

Modified:
   python/branches/p3yk/Modules/atexitmodule.c
   python/branches/p3yk/PC/config.c
Log:
Little fixes:
 * make some module variables static to prevent name pollution
 * Add some comments to clarify what's going on and some XXXs to address
 * Add a space after "for" before (
 * exc_value and tb can be NULL in some cases
 * Get working on Windows (I think)


Modified: python/branches/p3yk/Modules/atexitmodule.c
==============================================================================
--- python/branches/p3yk/Modules/atexitmodule.c	(original)
+++ python/branches/p3yk/Modules/atexitmodule.c	Wed Mar 21 05:45:04 2007
@@ -17,9 +17,9 @@
     PyObject *kwargs;
 } atexit_callback;
 
-atexit_callback **atexit_callbacks;
-int ncallbacks = 0;
-int callback_len = 32;
+static atexit_callback **atexit_callbacks;
+static int ncallbacks = 0;
+static int callback_len = 32;
 
 /* Installed into pythonrun.c's atexit mechanism */
 
@@ -33,7 +33,7 @@
     if (ncallbacks == 0)
         return;
         
-    for(i = ncallbacks - 1; i >= 0; i--)
+    for (i = ncallbacks - 1; i >= 0; i--)
     {
         cb = atexit_callbacks[i];
         if (cb == NULL)
@@ -42,10 +42,12 @@
         r = PyObject_Call(cb->func, cb->args, cb->kwargs);
         Py_XDECREF(r);
         if (r == NULL) {
+            /* Maintain the last exception, but don't leak if there are
+               multiple exceptions. */
             if (exc_type) {
                 Py_DECREF(exc_type);
-                Py_DECREF(exc_value);
-                Py_DECREF(exc_tb);    
+                Py_XDECREF(exc_value);
+                Py_XDECREF(exc_tb);    
             }
             PyErr_Fetch(&exc_type, &exc_value, &exc_tb);
             if (!PyErr_ExceptionMatches(PyExc_SystemExit)) {
@@ -92,6 +94,8 @@
     
     if (ncallbacks >= callback_len) {
         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);
 
@@ -145,7 +149,7 @@
     atexit_callback *cb;
     int i;
     
-    for(i = 0; i < ncallbacks; i++)
+    for (i = 0; i < ncallbacks; i++)
     {
         cb = atexit_callbacks[i];
         if (cb == NULL)
@@ -163,7 +167,7 @@
     atexit_callback *cb;
     int i, eq;
     
-    for(i = 0; i < ncallbacks; i++)
+    for (i = 0; i < ncallbacks; i++)
     {
         cb = atexit_callbacks[i];
         if (cb == NULL)
@@ -213,5 +217,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);
 }

Modified: python/branches/p3yk/PC/config.c
==============================================================================
--- python/branches/p3yk/PC/config.c	(original)
+++ python/branches/p3yk/PC/config.c	Wed Mar 21 05:45:04 2007
@@ -68,6 +68,7 @@
 extern void init_lsprof(void);
 extern void init_ast(void);
 extern void init_types(void);
+extern void initatexit(void);
 
 /* tools/freeze/makeconfig.py marker for additional "extern" */
 /* -- ADDMODULE MARKER 1 -- */
@@ -79,6 +80,7 @@
 
         {"array", initarray},
 	{"_ast", init_ast},
+	{"atexit", initatexit},
 #ifdef MS_WINDOWS
 #ifndef MS_WIN64
         {"audioop", initaudioop},


More information about the Python-3000-checkins mailing list