]> granicus.if.org Git - python/commitdiff
Little fixes:
authorNeal Norwitz <nnorwitz@gmail.com>
Wed, 21 Mar 2007 04:45:04 +0000 (04:45 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Wed, 21 Mar 2007 04:45:04 +0000 (04:45 +0000)
 * 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)

Modules/atexitmodule.c
PC/config.c

index b8a8bf65624a43d1b1b0589d169a9dc3cc01032d..9f6c80edd03ebd6b5694d40bd3c320d8c3bd9176 100644 (file)
@@ -17,9 +17,9 @@ typedef struct {
     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 @@ atexit_callfuncs(void)
     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 @@ atexit_callfuncs(void)
         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 @@ atexit_register(PyObject *self, PyObject *args, PyObject *kwargs)
     
     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_clear(PyObject *self)
     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_unregister(PyObject *self, PyObject *func)
     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 @@ initatexit(void)
     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);
 }
index 1d142b560814036cce5c21aebf1af926c33b5788..0885cdc011bacff0800f452b71f692e917c656ee 100644 (file)
@@ -68,6 +68,7 @@ extern void init_subprocess(void);
 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 @@ struct _inittab _PyImport_Inittab[] = {
 
         {"array", initarray},
        {"_ast", init_ast},
+       {"atexit", initatexit},
 #ifdef MS_WINDOWS
 #ifndef MS_WIN64
         {"audioop", initaudioop},