[issue10855] wave.Wave_read.close() doesn't release file

2011-01-12 Thread Peter Creath

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

2011-01-12 Thread Peter Creath

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

2011-01-07 Thread Peter Creath

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