RFR 8080225: FileInputStream cleanup should be improved

Peter Levart peter.levart at gmail.com
Sat Oct 14 08:51:34 UTC 2017


Hi Roger,

I know I'm late for the comments on this one, but anyway...

I'm looking at JNI part of FileDescriptor. There are now two native 
"close" methods for each FileDescriptor variant (unix/windows). One is 
instance method (close0) and the other is static (cleanupClose0), which 
takes an int fd / long handle argument. close0 delegates to C method 
"fileDescriptorClose", which could be implemented entirely in Java with 
a little help from static cleanupClose0, don't you think? This could be 
a follow-up cleanup effort.

Regards, Peter

On 10/04/17 16:35, Roger Riggs wrote:
> Hi Mandy,
>
> Updated the webrev in place:
>    http://cr.openjdk.java.net/~rriggs/webrev-fis-cleanup-8080225/
>
>
> On 10/3/2017 7:17 PM, mandy chung wrote:
>> Hi Roger,
>>
>> This looks good overall.
>>
>> 53 * unreachable should explicitly override {@link #finalize} and 
>> call {@code close}.
>>
>> Since finalize is deprecated, I would not recommend to have the 
>> subclass adding the finalize method.  I suggest to take that phrase 
>> out (I gave a similar comment to JDK-8185582 [1]). Users should use 
>> try-with-resource or register the instances in a cleaner.
> ok, but neither t-w-r or cleaner can completely replace the behavior 
> of finalize.
> In some cases, significant refactoring of the application class may be 
> needed.
>>
>> As for the tests, FinalizeShdCallClose.java implements finalize.  I 
>> think it'd be good to convert them to try-with-resource.
> The new tests Unreferenced*ClosesFd incorporate the original 
> FinalizeShdCallClose tests cases
> except the case where the subclass does override finalize to call 
> closed; behavior that is deprecated
> but still supported.
> I refactored the Unreferenced*ClosesFd tests to make the 
> FinalizeShdCallClose tests unnecessary and
> will remove them. [If the CSR requires greater behavioral 
> compatibility, the tests may be needed again].
>
>>
>> I'm not close to java.io implementation.  Would registerCleanup be 
>> called more than once? line 220 in the registerCleanup will create a 
>> new cleanup if it's invoked the second time - is it intentional?
>> 216 synchronized void registerCleanup() {
>> 217 if (cleanup != null) {
>> 218 cleanup.clear();
>> 219 }
>> 220 cleanup = FDCleanup.create(this);
>> 221 }
> Re-registering *clears* not cleans the previous cleanup and then 
> creates a new one.
> If the native fd has changed a new cleanup is needed.
> There no cases currently where registerCleanup is called twice on the 
> same FileDescriptor.
>
> Thanks, Roger
>
>> thanks Mandy
>> [1] 
>> http://mail.openjdk.java.net/pipermail/core-libs-dev/2017-September/049362.html
>>
>> On 9/29/17 10:17 AM, Roger Riggs wrote:
>>> Replacing finalizers in FileInputStream, FileOutputStream, and 
>>> adding cleanup to RandomAccessFile
>>> and NIO File Channels with Cleaner based implementations required 
>>> changes to FileDescriptor.
>>>
>>> The specification of FileInputStream and FileOutputStream is changed 
>>> to remove the finalizer
>>> behavior that required their respective close methods to be called.
>>> This change to the behavior is tracked with CSR 8187325 [3].
>>>
>>> The FileDescriptor implementations (Unix and Windows) provide a 
>>> cleanup function that is now used by
>>> FIS, FOS, RAF, and async and normal FileChannels.  Each requests 
>>> FileDescriptor to register a cleanup function
>>> when the fd or handle is assigned and delegates to 
>>> FileDescriptor.close.  If the respective
>>> FileDescriptor.close method is not called, the fd or handle will be 
>>> closed when the FileDescriptor
>>> is determined to be phantom reachable.
>>>
>>> The other uses of FileDescriptor are not intended to be changed, for 
>>> example in sockets and datagrams.
>>>
>>> Some tests were modified to not rely on finalization; new tests are 
>>> provided.
>>>
>>> Comments are appreciated on both the CSR [3] and the implementation 
>>> [1].
>>>
>>> [1] webrev: 
>>> http://cr.openjdk.java.net/~rriggs/webrev-fis-cleanup-8080225/
>>>
>>> [2] Issue: https://bugs.openjdk.java.net/browse/JDK-8080225
>>>
>>> [3] CSR:  8187325  FileInputStream/FileOutputStream should use the 
>>> Cleaner instead of finalize
>>> https://bugs.openjdk.java.net/browse/JDK-8187325
>>>
>>> Thanks, Roger
>>>
>>>
>>
>



More information about the core-libs-dev mailing list