ServerSocket.accept()/scheduler bug (Kaffe 0.91 BSDI 3.1)

David Caldwell dpcaldwell@sherwin.com
Thu, 5 Feb 1998 12:46:03 -0500


______________________________ Forward Header __________________________________
Subject: ServerSocket.accept()/scheduler bug (Kaffe 0.91 BSDI 3.1)
Author:  David Caldwell at TRANS_PO
Date:    2/5/98 8:48 AM


     Hello all.
     
     I tried to subscribe to the mailing list by sending a "subscribe" 
     message to kaffe-request@tjwassoc.demon.co.uk, but I haven't heard 
     back.  This message is being sent to kaffe@tjwassoc.demon.co.uk.
     
     PROBLEM
     
     After long examination, I believe I've found a Kaffe bug.  The method 
     accept() of java.net.ServerSocket not only blocks when it is called, 
     it will:
     
        (a)     ignore the SoTimeout parameter,
     
        (b)     never relinquish the CPU.
     
     My program runs fine on Sun's Windows 95 implementation, which has a 
     pre-emptive scheduler.  Though I have not been able to test the 
     program with a non-preemptive scheduler, I've done enough testing to 
     decide that it -should- work on a non-pre-emptive scheduler, also.
     
     FAILED WORKAROUNDS
     
     I've tried a number of workarounds -- killing the thread, lowering its 
     priority, etc.  You can't kill the thread because it's blocking and 
     won't give any other thread the CPU for even one instruction.  No 
     matter how low the thread's priority is, if it gets to the accept() 
     call, it will hang there forever -- or until another socket connection 
     is received.
     
     POTENTIAL WORKAROUND
     
     Because it will release when another connection is received, I could 
     construct a workaround -if- there was a ServerSocket method which told 
     whether there were any connections backlogged (analogous to the 
     ready() method for InputStreams).  But I can't find any such method -- 
     so that's a Java question.
     
     ACTUAL (BUT UNTESTED, NATCH) WORKAROUND
     
     The other workaround (which I haven't tried -- but am counting on) is 
     to start a SECOND virtual machine and have it (more or less) 
     continually request socket connections with the first VM; then send 
     something through the socket verifying that it's a "fake" connection, 
     thus allowing the first VM to unblock and proceed.  Inelegant, but if 
     you're desperate, it would probably work.  I'll follow up.
     
     NOTES
     
     I can't actually look at the source code because I don't control my 
     own Kaffe distribution (my web hoster does).  Unless I want to 
     download it locally, which I don't, at least for the moment.  
     
     REPLY TO
     
     Also, I'm not sure that I'm actually subscribed to the mailing list 
     (haven't received confirmation) so any replies should go to 
     inonit@inonit.com.
     
     WHAT I'M LOOKING FOR
     
        (a)     Workaround, if possible.
     
        (b)     Less important would be a fix to the underlying problem.
     
     -- David.