07-31-06 12:12 PM
Okay, found the source of the memory leak. The problem goes right back
to 3.1.4 which also has the problem when tested.
The problem code is in python_handler() in 'src/mod_python.c'.
Specifically
the code does:
if (!hle) {
/* create a handler list object from dynamically registered
handlers */
request_obj->hlo = (hlistobject *)MpHList_FromHLEntry
(dynhle, 1);
}
else {
/* create a handler list object */
request_obj->hlo = (hlistobject *)MpHList_FromHLEntry(hle, 1);
/* add dynamically registered handlers, if any */
if (dynhle) {
MpHList_Append(request_obj->hlo, dynhle);
}
}
Problem is that request_obj->hlo can already be set by a prior phase's
handler and by simply assigning to request_obj->hlo you get a memory
leak as it is a Python object and it isn't being decref'd.
Thus, before this 'if' statement, it would appear that the following
should
be inserted.
if (request_obj->hlo)
Py_DECREF(request_obj->hlo);
or:
Py_XDECREF(request_obj->hlo);
Still need to do some more checking, but adding that seems to get rid of
the problem.
Now what do we do about 3.2.10? Given that this thing leaks really badly
when triggered shows that no one must be using multiple handler phases
at the same time, so may be safe to still release 3.2.10 and we fix
it in next
backport release and 3.3.
Comments.
Graham
On 31/07/2006, at 7:24 PM, Graham Dumpleton wrote:
[vbcol=seagreen]
> The good news is that this isn't a problem introduced with
> mod_python 3.2.10
> so doesn't necessarily have to stop that being released.
>
> The bad news though is that is is also in mod_python 3.2.8, so it
> has been
> there for some time.
>
> The question now is whether anyone else sees it on other platforms
> or whether
> it is something specific to my machine.
>
> Graham
>
> On 31/07/2006, at 4:53 PM, Graham Dumpleton wrote:
>
[ Post a follow-up to this message ]
|