Hello.
This was originally reported in the Trac Open Source Project,
but had not been reported to us by using normal channels.
Current implementation of the wrappers for svn_delta_editor_t and
svn_repos_parse_fns3_t C APIs had some leakage of Python ref-counts:
(1) An edit baton make by delta.make_editor / a parse_fns3 baton
made by repos.make_parse_fns3 hold a reference of
editor object / parse_fns3 object and they never release it.
This was pointed out in the Trac Open Source Project
ticket #13112[1], #13129[2], and #13356[3].
(2) Wrapper functions of C APIs which drive svn_delta_editor_t
svn_repos_parse_fns3_t did not care for the references of
baton items created by Python call back functions when an
error is occured during proccessing call back of the API.
(3) parse_fns3 driver object and parse_baton can make a circular
references through the pool cleanup callback registration:
The pool can never cleanup if the parse_fns3 driver object
is allocated from the pool.
[1] repository sync with large Subversion repository has memory leaks
https://trac.edgewall.org/ticket/13112
[2] trac-admin resync leaks memory
https://trac.edgewall.org/ticket/13129
[3] Subversion pool is destroyed more than once while testing
trac/versioncontrol/tests/functional.py, comment 6
https://trac.edgewall.org/ticket/13356#comment:6
To avoid those problems, I re-implemented those API wrapper by using
pure Python object batons, which are visible from Python interpreter.
I'll commit it later.
Cheers,
--
Yasuhito FUTATSUKI <[email protected]>