On 9/29/17, 1:18 PM, Peter Levart wrote:
Hi Sherman,
putStream> streams =  Collections.newSetFromMap(new WeakHashMap<>());

I also noticed that it is useless to test whether the inflater is ended() when obtaining it from or releasing it into cache if the code keeps the invariant that it never ends inflaters while they are still in cache or associated with the open stream (the only place where inflaters should be ended explicitly is in the Releaser). To make this even more obvious, it might be good to move the obtaining/releasing logic directly into the ZipFileInflaterInputStream constructor which would be passed a reference to the inflatersCache instead of the Inflater instance.


If my memory serves me correctly, this "ended()" check was for the situation that the ZipfileInflaterStream is getting finalized (close() is not called explicitly/directly) and its inflater is also getting finalized at the same time/pass, and the inflater.end() gets called (by its finalize()) first, so when the zfis tries to release the inflater back to the cache, it has been "ended" already. We had some nasty finalize() and object resurrection timing issue in earlier releases, that probably is part of the fix (since it's a timing issue, we also do the same "ended()" check in getInflater() when lease it out) So my question is that do we have the similar situation under the Cleaner? mean the zfis and its inflater both are
phantom reachable and the inflater's cleaner gets called first?

I'm still reading your proposed change to remove the "inflater" from the stream->inflater
mapping to see if there is any loophole, will reply that separately later.

-sherman

Reply via email to