Date: Mon, 11 Dec 2006 17:24:46 +0200 From: Achilleas Mantzios <achill@matrix.gatewaynet.com> To: freebsd-java@freebsd.org Subject: Re: close() of active socket does not work on FreeBSD 6 Message-ID: <200612111724.46716.achill@matrix.gatewaynet.com> In-Reply-To: <Pine.LNX.4.62.0612111535280.32258@decibel.pvv.ntnu.no> References: <Pine.LNX.4.62.0612111535280.32258@decibel.pvv.ntnu.no>
next in thread | previous in thread | raw e-mail | index | archive | help
Στις Δευτέρα 11 Δεκέμβριος 2006 16:46, ο/η Arne H. Juul έγραψε: > I've had problems with some tests hanging on FreeBSD 6/amd64. This happens > both with diablo-1.5.0_07-b01 and the java/jdk15 compiled from ports. > > After much digging we've determined that the root cause is that > the guarantee in the socket.close() API, see the documentation at > http://java.sun.com/j2se/1.5.0/docs/api/java/net/Socket.html#close() > isn't fulfulled - the thread blocked in I/O on the socket doesn't wake up. > > Here's a pretty small test program that demonstrates the problem (given > that you're running sshd on port 22, if not change the port number to > something that the program can connect to). Is this a known problem? > Does it happen for everybody on FreeBSD 6? > In my systems, 1.4.2-p7, diablo-1.5.0_07-b00 have this problem. However with linux 1.4.2_12-b03 right after socket.close(), IOException is thrown and caught by the FooConn thread. > > > import java.io.*; > import java.net.*; > import java.util.*; > import java.util.logging.*; > > public class FooConn extends Thread { > private boolean alive; > public final int port; > private Socket socket = null; > > public FooConn(int port) { > super("FooConn:" + port); > this.port = port; > this.alive = true; > } > private void connect() { > while (socket == null) { > try { > socket = new Socket("localhost", port); > } catch(IOException e) { > System.err.println("Connect failed: " + e); > try { Thread.sleep(1000); } catch(InterruptedException ie) > {} > } > } > } > public void disconnect() throws IOException, InterruptedException { > alive = false; > System.out.println("closing socket"); > socket.close(); > System.out.println("calling join"); > join(); > } > public void run() { > while (alive) { > if (socket == null) { > System.out.println("socket null, connect"); > connect(); > } > try { > int b = socket.getInputStream().read(); > System.out.println("got byte "+ b); > } catch (IOException e) { > System.out.println("IOException, set socket to null"); > socket = null; //triggers reconnect > } catch (RuntimeException e) { > System.err.println("RuntimeException "+e); > return; > } > } > } > public static void main(String[] args) throws IOException { > try { > FooConn conn = new FooConn(22); > conn.start(); > Thread.sleep(1000); > conn.disconnect(); > } catch(InterruptedException ie) {} > } > } > _______________________________________________ > freebsd-java@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-java > To unsubscribe, send any mail to "freebsd-java-unsubscribe@freebsd.org" -- Achilleas Mantzios
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200612111724.46716.achill>
