]> granicus.if.org Git - python/commitdiff
Fix a few more memory leaks
authorNeal Norwitz <nnorwitz@gmail.com>
Sun, 20 Nov 2005 23:58:38 +0000 (23:58 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Sun, 20 Nov 2005 23:58:38 +0000 (23:58 +0000)
Document more info about the benefits of configuring without
pymalloc when running valgrind

Misc/README.valgrind
Python/ast.c
Python/compile.c
Python/modsupport.c

index 8e480e9c9cb8e6912055d89e6be6fc4df9fb958c..157bdc3ca3a1680e78f3e8496e03249e9c27d057 100644 (file)
@@ -12,6 +12,19 @@ Misc/valgrind-python.supp.  Second, you must do one of the following:
   * Uncomment the lines in Misc/valgrind-python.supp that
     suppress the warnings for PyObject_Free and PyObject_Realloc
 
+If you want to use Valgrind more effectively and catch even more
+memory leaks, you will need to configure python --without-pymalloc.
+PyMalloc allocates a few blocks in big chunks and most object
+allocations don't call malloc, they use chunks doled about by PyMalloc
+from the big blocks.  This means Valgrind can't detect
+many allocations (and frees), except for those that are forwarded
+to the system malloc.  Note: configuring python --without-pymalloc
+makes Python run much slower, especially when running under Valgrind.
+You may need to run the tests in batches under Valgrind to keep
+the memory usage down to allow the tests to complete.  It seems to take
+about 5 times longer to run --without-pymalloc.
+
+
 Details:
 --------
 Python uses its own small-object allocation scheme on top of malloc,
@@ -21,7 +34,8 @@ Valgrind may show some unexpected results when PyMalloc is used.
 Starting with Python 2.3, PyMalloc is used by default.  You can disable
 PyMalloc when configuring python by adding the --without-pymalloc option.
 If you disable PyMalloc, most of the information in this document and
-the supplied suppressions file will not be useful.
+the supplied suppressions file will not be useful.  As discussed above,
+disabling PyMalloc can catch more problems.
 
 If you use valgrind on a default build of Python,  you will see
 many errors like:
index 87a9a4b3a09644f372f9011da47dae699871e301..731bf9a49175c14d12efab5fe321496ff44c389c 100644 (file)
@@ -1054,8 +1054,12 @@ ast_for_listcomp(struct compiling *c, const node *n)
             return NULL;
         }
 
-       if (asdl_seq_LEN(t) == 1)
+       if (asdl_seq_LEN(t) == 1) {
            lc = comprehension(asdl_seq_GET(t, 0), expression, NULL);
+           /* only free the sequence since we grabbed element 0 above */
+           if (lc)
+               asdl_seq_free(t); /* ok */
+       }
        else
            lc = comprehension(Tuple(t, Store, LINENO(ch)), expression, NULL);
 
@@ -1222,9 +1226,13 @@ ast_for_genexp(struct compiling *c, const node *n)
             return NULL;
         }
         
-        if (asdl_seq_LEN(t) == 1)
+        if (asdl_seq_LEN(t) == 1) {
             ge = comprehension(asdl_seq_GET(t, 0), expression,
                                NULL);
+           /* only free the sequence since we grabbed element 0 above */
+           if (ge)
+               asdl_seq_free(t); /* ok */
+       }
         else
             ge = comprehension(Tuple(t, Store, LINENO(ch)),
                                expression, NULL);
index 4d637ae62af8ad059e84e9cd315e70775e8d5c0e..5905c456c6ed5acc4a64b059995bfe1091de4af0 100644 (file)
@@ -2384,7 +2384,10 @@ compiler_import_as(struct compiler *c, identifier name, identifier asname)
                        dot = strchr(src, '.');
                        attr = PyString_FromStringAndSize(src, 
                                            dot ? dot - src : strlen(src));
+                       if (!attr)
+                               return -1;
                        ADDOP_O(c, LOAD_ATTR, attr, names);
+                       Py_DECREF(attr);
                        src = dot + 1;
                }
        }
index 197d99b1d1f82cd66065a68ef1dcbe93ecc83a56..fbfb48dc265df7f13780e953f51d85b92f2b60b3 100644 (file)
@@ -82,6 +82,7 @@ Py_InitModule4(char *name, PyMethodDef *methods, char *doc,
                        }
                        Py_DECREF(v);
                }
+               Py_DECREF(n);
        }
        if (doc != NULL) {
                v = PyString_FromString(doc);