# HG changeset patch # User chegar # Date 1421341506 0 # Node ID 55242c4e5b0afecc4b503dba1a2664aff8e901d3 # Parent 208a556546d3f31e849b2b61d8720fcbb7b1655d 8042581: Intermittent failure in java/net/DatagramSocket/InheritHandle.java Reviewed-by: alanb, chegar diff -r 208a556546d3 -r 55242c4e5b0a jdk/test/java/net/DatagramSocket/InheritHandle.java --- a/jdk/test/java/net/DatagramSocket/InheritHandle.java Thu Jan 15 19:16:17 2015 +0400 +++ b/jdk/test/java/net/DatagramSocket/InheritHandle.java Thu Jan 15 17:05:06 2015 +0000 @@ -22,27 +22,51 @@ */ /* @test - * @bug 4945514 + * @bug 4945514 8042581 * @summary DatagramSocket should make handle not inherited */ -import java.net.*; +import java.net.BindException; +import java.net.DatagramSocket; +import java.net.InetSocketAddress; public class InheritHandle { + private static final long SLEEPTIME_MS = 1000L; + public static void main(String[] args) throws Exception { - DatagramSocket sock = new DatagramSocket (0); - sock.setReuseAddress(true); - int port = sock.getLocalPort(); + int port; + try (DatagramSocket sock = new DatagramSocket(0);) { + sock.setReuseAddress(true); + port = sock.getLocalPort(); + + /** + * spawn a child to check whether handle passed to it or not; it + * shouldn't + */ + Runtime.getRuntime().exec("sleep 10"); + } - /** - * spawn a child to check whether handle passed to it or not; - * it shouldn't - */ - Runtime.getRuntime().exec ("sleep 10"); + try (DatagramSocket sock = new DatagramSocket(null);) { + sock.setReuseAddress(true); + int retries = 0; + boolean isWindows = System.getProperty("os.name").startsWith("Windows"); + InetSocketAddress addr = new InetSocketAddress(port); + while (true) { + try { + sock.bind(addr); + break; + } catch (BindException e) { + if (isWindows && retries++ < 5) { + Thread.sleep(SLEEPTIME_MS); + System.out.println("BindException \"" + e.getMessage() + "\", retrying..."); + continue; + } else { + throw e; + } + } + } - sock.close(); - sock = new DatagramSocket (null); - sock.setReuseAddress(true); - sock.bind(new InetSocketAddress(port)); + } } } +