harmony-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Tim Ellison <t.p.elli...@gmail.com>
Subject Re: [jira] Created: (HARMONY-479) java.io.FileInputStream and FileOutputStream might cause Finalizer thread suspending
Date Tue, 23 May 2006 15:11:00 GMT
FYI exceptions thrown during a finalize method end the execution of that
method, but otherwise are ignored by the finalizer.

Regards,
Tim

Paulex Yang wrote:
> Gregory,
> 
> Sorry I response so late. I just back from a long vacation and it took
> me longer time than I expected to catch up the mailing list (after all,
> it's very active!). Please see my comments below.
> 
> Gregory Shimansky wrote:
>> Hello Paulex
>>
>> I have a question about this problem. Do you know how exception in
>> finalizer
>> method affects the finalizer thread that it becomes suspended? I thought
>> that when calling finalize method the code should catch all exceptions
>> thrown by it and ignore them. AFAIK that's how finalizers are
>> implemented in
>> DRLVM. It specification it is written that
> First of all, I think this issue should not happen if the spec of
> FileInputStream/OutputStream doesn't require the implementation to
> invoke close() in finalize() method, IMHO, generally it's not good
> practice to depend on finalize(), and I guess this spec is inherited
> from very early version, say, JDK 1.0, when the channel hasn't been not
> introduced.
> 
> And actually I don't know exactly what happened to the finalizer thread
> when the NullPointerException thrown, because, as you know, the Harmony
> VME provided by IBM is only binary. What I saw is that the debugger
> sometimes stops on the suspending finalizer thread at the
> FileInputStream/OutputStream's close(), and the message shows that
> "NullPointerException caused suspending"(maybe not exact words, but very
> similar). So I tried to fix this problem in Java codes.
> 
> And I'd glad to have a try on DRLVM later, but anyway,  I think it is
> not bad idea to make our classlib codes more defensive and reliable.
> your ideas?
>>
>> "If an uncaught exception is thrown by the finalize method, the
>> exception is
>> ignored and finalization of that object terminates."
>>
>> 2006/5/19, Paulex Yang (JIRA) <jira@apache.org>:
>>>
>>> java.io.FileInputStream and FileOutputStream might cause Finalizer
>>> thread
>>> suspending
>>>
>>> ------------------------------------------------------------------------------------
>>>
>>>
>>>          Key: HARMONY-479
>>>          URL: http://issues.apache.org/jira/browse/HARMONY-479
>>>      Project: Harmony
>>>         Type: Bug
>>>
>>>   Components: Classlib
>>>     Reporter: Paulex Yang
>>>
>>>
>>> If one FileInputStream instance is not constructed properly, say, the
>>> given file doesn't exist, the constructor will throw exception but the
>>> FileInputStream instance is still necessary to be garbage collected,
>>> and the
>>> spec of FileInputStream's finalize() method requires that close()
>>> must be
>>> invoked, but the current implementation of FileInputStream.close()(as
>>> below) will causes NullPointerException in Finalizer thread because
>>> channel
>>> field has not been initialized yet.
>>>
>>>     public void close() throws IOException {
>>>             synchronized (channel) {
>>>                 synchronized (this) {
>>>                     if (channel.isOpen() && fd.descriptor >= 0) {
>>>                         channel.close();
>>>                     }
>>>                     fd.descriptor = -1;
>>>                 }
>>>             }
>>>     }
>>>
>>> This issue applies to FileOutputStream, too. Test case below can
>>> reproduce
>>> this issue only in debugger, because it is not easy to get the handle of
>>> Finalizer thread. Debugging the test case to the statement following the
>>> System.gc(), the debugger will show that the Finalizer thread is
>>> suspended
>>> due to NullPointerException.
>>>
>>>
>>> public class FileInputStreamTest {
>>>     public static void main(String[] args) throws Exception{
>>>         FileInputStream is = null;
>>>         try{
>>>             is = new FileInputStream(new File("nonexist"));
>>>         }catch(Exception e){
>>>             System.gc();
>>>             e.printStackTrace();
>>>         }
>>>     }
>>> }
>>>
>>>
>>>
>>>
>>> -- 
>>> This message is automatically generated by JIRA.
>>> -
>>> If you think it was sent incorrectly contact one of the administrators:
>>>    http://issues.apache.org/jira/secure/Administrators.jspa
>>> -
>>> For more information on JIRA, see:
>>>    http://www.atlassian.com/software/jira
>>>
>>>
>>
>>
> 
> 

-- 

Tim Ellison (t.p.ellison@gmail.com)
IBM Java technology centre, UK.

---------------------------------------------------------------------
Terms of use : http://incubator.apache.org/harmony/mailing.html
To unsubscribe, e-mail: harmony-dev-unsubscribe@incubator.apache.org
For additional commands, e-mail: harmony-dev-help@incubator.apache.org


Mime
View raw message