Commit 7bcabc60 authored by Neal Norwitz's avatar Neal Norwitz

Fix a few more memory leaks

Document more info about the benefits of configuring without
pymalloc when running valgrind
parent 4aef41ff
......@@ -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:
......
......@@ -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);
......
......@@ -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;
}
}
......
......@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment