[issue10855] wave.Wave_read.close() doesn't release file
Peter Creath pjcreath+pyt...@gmail.com added the comment: Thank you for clarifying the documentation. However, I don't think that fully resolves the issue. I'm not complaining about a failure to close the file. As you observe, it doesn't need to (and shouldn't) close a file object, but it should release the reference. The code already tries to release the reference (self._file = None). It just fails to release it correctly, missing the other reference to the file object (self._data_chunk). That's the bug. Your clarification of the documentation is appreciated nonetheless. I've attached a patch as Ned requested. The same patch can currently be applied to release27-maint, release31-maint, and py3k. (The line numbers and surrounding context are identical.) -- keywords: +patch resolution: fixed - status: closed - open versions: +Python 2.5, Python 2.6, Python 3.1 Added file: http://bugs.python.org/file20374/issue10855.diff ___ Python tracker rep...@bugs.python.org http://bugs.python.org/issue10855 ___ ___ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
[issue10855] wave.Wave_read.close() doesn't release file
Peter Creath pjcreath+pyt...@gmail.com added the comment: A point of clarification on the original report: Georg is completely right when he points out that this is only an issue when passing in a file object. If passed a filename, wave.py both opens and closes the file explicitly, and the dangling reference isn't important, as Antoine observes. However, a retained reference in the file-object case is still a leak. Georg writes: Of course we could set _data_chunk to None, but I'm unsure what behavior change you would expect from that. It allows garbage collection to close the file object if there are no more references to it. It seems reasonable for a client of wave.py to assume that close() will release all references to the object, and indeed the code seems to support that assumption -- it sets _file to None. If releasing references were truly of no importance, then I would argue that the line setting _file to None should be removed. It serves no purpose after wave.py has explicitly closed the file (if it opened it) other than to release a reference to the file object. Therefore, I suggest that _data_chunk should also be set to None in order to release the reference completely, thereby allowing the file object to be garbage collected. -- ___ Python tracker rep...@bugs.python.org http://bugs.python.org/issue10855 ___ ___ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
[issue10855] wave.Wave_read.close() doesn't release file
New submission from Peter Creath pjcreath+pyt...@gmail.com: Calling wave.close() fails to release all references to the file passed in via wave.open(filename_or_obj, rb). As a result, processing many wave files produces an IOError of too many files open. This bug is often masked because this dangling reference is collected if the wave object is collected. However, if the wave object is retained, calling wave_obj.close() won't release the reference, and so the file will never be closed. There are two solutions: 1) The workaround: the client program can explicitly close the file object it passed to the wave object (file_obj.close()). 2) The bug fix: the wave module can properly release the extra reference to the file, by setting self._data_chunk = None in the close() method. Explanation: Trunk code (and 2.7.1, and older): def close(self): if self._i_opened_the_file: self._i_opened_the_file.close() self._i_opened_the_file = None self._file = None but note initfp(self, file): ... self._file = Chunk(file, bigendian = 0) ... chunk = Chunk(self._file, bigendian = 0) ... self._data_chunk = chunk ... therefore close needs to add: self._data_chunk = None -- components: Library (Lib) messages: 125654 nosy: pjcreath priority: normal severity: normal status: open title: wave.Wave_read.close() doesn't release file type: resource usage versions: Python 2.7 ___ Python tracker rep...@bugs.python.org http://bugs.python.org/issue10855 ___ ___ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com