jdk/test/java/nio/channels/SocketChannel/AsyncCloseChannel.java
changeset 702 3bd5e70b2fe9
parent 2 90ce3da70b43
child 715 f16baef3a20e
--- a/jdk/test/java/nio/channels/SocketChannel/AsyncCloseChannel.java	Fri Jun 13 10:45:51 2008 +0200
+++ b/jdk/test/java/nio/channels/SocketChannel/AsyncCloseChannel.java	Sat Jun 14 09:30:20 2008 -0700
@@ -22,7 +22,7 @@
  */
 
 /* @test
- * @bug 6285901
+ * @bug 6285901 6501089
  * @summary Check no data is written to wrong socket channel during async closing.
  * @author Xueming Shen
  */
@@ -33,13 +33,13 @@
 import java.net.*;
 
 public class AsyncCloseChannel {
-    static boolean failed = false;
-    static boolean keepGoing = true;
+    static volatile boolean failed = false;
+    static volatile boolean keepGoing = true;
+    static int maxAcceptCount = 100;
+    static volatile int acceptCount = 0;
     static String host = "127.0.0.1";
-    static int sensorPort = 3010;
-    static int targetPort = 3020;
-    static int maxAcceptCount = 1000;
-    static int acceptCount = 0;
+    static int sensorPort;
+    static int targetPort;
 
     public static void main(String args[]) throws Exception {
         if (System.getProperty("os.name").startsWith("Windows")) {
@@ -48,11 +48,15 @@
         }
         Thread ss = new SensorServer(); ss.start();
         Thread ts = new TargetServer(); ts.start();
+
+        sensorPort = ((ServerThread)ss).server.getLocalPort();
+        targetPort = ((ServerThread)ts).server.getLocalPort();
+
         Thread sc = new SensorClient(); sc.start();
         Thread tc = new TargetClient(); tc.start();
 
         while(acceptCount < maxAcceptCount && !failed) {
-            Thread.yield();
+            Thread.sleep(10);
         }
         keepGoing = false;
         try {
@@ -66,11 +70,8 @@
                                        + acceptCount + "> times of accept!");
     }
 
-
-    static class SensorServer extends ThreadEx {
+    static class SensorServer extends ServerThread {
         public void runEx() throws Exception {
-            ServerSocket server;
-            server = new ServerSocket(sensorPort);
             while(keepGoing) {
                 try {
                     final Socket s = server.accept();
@@ -80,7 +81,7 @@
                                 int c = s.getInputStream().read();
                                 if(c != -1) {
                                     // No data is ever written to the peer's socket!
-                                    System.out.println("Oops: read a character: "
+                                    System.err.println("Oops: read a character: "
                                                        + (char) c);
                                     failed = true;
                                 }
@@ -92,17 +93,14 @@
                         }
                     }.start();
                 } catch (IOException ex) {
-                    //ex.printStackTrace();
+                    System.err.println("Exception on sensor server " + ex.getMessage());
                 }
             }
         }
     }
 
-    static class TargetServer extends ThreadEx {
+    static class TargetServer extends ServerThread {
         public void runEx() throws Exception {
-
-            ServerSocket server;
-            server = new ServerSocket(targetPort);
             while (keepGoing) {
                 try {
                     final Socket s = server.accept();
@@ -127,7 +125,7 @@
                         }
                     }.start();
                 } catch (IOException ex) {
-                    //ex.printStackTrace();
+                    System.err.println("Exception on target server " + ex.getMessage());
                 }
             }
         }
@@ -142,19 +140,19 @@
                 try {
                     s = new Socket();
                     synchronized(this) {
-                        while(!wake) {
+                        while(!wake && keepGoing) {
                             try {
                                 wait();
                             } catch (InterruptedException ex) { }
                         }
+                        wake = false;
                     }
-                    wake = false;
                     s.connect(new InetSocketAddress(host, sensorPort));
                     try {
                         Thread.sleep(10);
                     } catch (InterruptedException ex) { }
                 } catch (IOException ex) {
-                    System.out.println("Exception on sensor client " + ex.getMessage());
+                    System.err.println("Exception on sensor client " + ex.getMessage());
                 } finally {
                     if(s != null) {
                         try {
@@ -200,26 +198,49 @@
                                 }
                             } catch (IOException ex) {
                                 if(!(ex instanceof ClosedChannelException))
-                                    System.out.println("Exception in target client child "
+                                    System.err.println("Exception in target client child "
                                                        + ex.toString());
                             }
                         }
                     };
                     t.start();
-                    while(!ready)
-                        Thread.yield();
+                    while(!ready && keepGoing) {
+                        try {
+                            Thread.sleep(10);
+                        } catch (InterruptedException ex) {}
+                    }
                     s.close();
                     SensorClient.wakeMe();
                     t.join();
                 } catch (IOException ex) {
-                     System.out.println("Exception in target client parent "
+                     System.err.println("Exception in target client parent "
                                         + ex.getMessage());
                 } catch (InterruptedException ex) {}
             }
         }
     }
 
-    static abstract class ThreadEx extends Thread {
+    static abstract class ServerThread extends Thread {
+        ServerSocket server;
+        public ServerThread() {
+            super();
+            try {
+                server = new ServerSocket(0);
+            } catch (IOException ex) {
+                ex.printStackTrace();
+            }
+        }
+
+        public void interrupt() {
+            super.interrupt();
+            if (server != null) {
+                try {
+                    server.close();
+                } catch (IOException ex) {
+                    ex.printStackTrace();
+                }
+            }
+        }
         public void run() {
             try {
                 runEx();
@@ -231,7 +252,6 @@
         abstract void runEx() throws Exception;
     }
 
-
     public static void closeIt(Socket s) {
         try {
             if(s != null)