Antoine Pitrou added the comment: > In the example Martin gave in his PEP 3121, the PyInit does not perform any > INCREFs on > the Variables that are referenced from inside the module state. > He therefore left out m_free completely as there was nothing to DECREF within > the module > state. > Back when I did my GSoC together with Martin, we decided that the Module > state itself can > be considered a valid container object, an therefore has to INCREF and in the > end of its > lifecycle (that is within m_free) also DECREF every object reference it > holds. I therefore > decided to include that into every module I refactored, and consequently also > the xxmodule.
I agree with that, but then PEP 3121's example code should be fixed. > I am yet undecided regarding the NULL-check for FindModule. Not checking for NULL makes it dangerous to implement unloading of extension modules: see issue18674. If checking for NULL makes extension code too complicated, then please take a look at the helper API I've suggested in issue18710. Also, it would be nice if you could also read the following python-dev thread, since it discusses concrete issues and possible solutions: http://mail.python.org/pipermail/python-dev/2013-August/127862.html > This means we can not test for these leaks from within Python, but need some > C-Code You can use _testcapi.run_in_subinterp() to run custom code in a sub-interpreter. Here is an example of a non-leaking extension module, and then a (presumably) leaking one: $ ./python -Xshowrefcount Python 3.4.0a1+ (default:9e61563edb67, Aug 12 2013, 14:52:25) [GCC 4.7.3] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import _testcapi [64175 refs, 19937 blocks] >>> _testcapi.run_in_subinterp("import resource") 0 [68839 refs, 20969 blocks] >>> _testcapi.run_in_subinterp("import resource") 0 [68852 refs, 20980 blocks] >>> _testcapi.run_in_subinterp("import resource") 0 [68850 refs, 20979 blocks] >>> _testcapi.run_in_subinterp("import resource") 0 [68852 refs, 20980 blocks] >>> _testcapi.run_in_subinterp("import resource") 0 [68850 refs, 20979 blocks] >>> _testcapi.run_in_subinterp("import _socket") 0 [71840 refs, 22059 blocks] >>> _testcapi.run_in_subinterp("import _socket") 0 [71911 refs, 22083 blocks] >>> _testcapi.run_in_subinterp("import _socket") 0 [71981 refs, 22107 blocks] >>> _testcapi.run_in_subinterp("import _socket") 0 [72051 refs, 22131 blocks] ---------- nosy: +pitrou _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue15849> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com