src/java.net.http/share/classes/jdk/internal/net/http/PlainHttpConnection.java
branchhttp-client-branch
changeset 56165 8a6065d830b9
parent 56101 983e338eeb50
child 56299 903ff8ec239d
--- a/src/java.net.http/share/classes/jdk/internal/net/http/PlainHttpConnection.java	Thu Feb 22 14:58:11 2018 +0000
+++ b/src/java.net.http/share/classes/jdk/internal/net/http/PlainHttpConnection.java	Thu Feb 22 17:33:21 2018 +0000
@@ -51,7 +51,7 @@
 
     private final Object reading = new Object();
     protected final SocketChannel chan;
-    private final FlowTube tube;
+    private final SocketTube tube; // need SocketTube to call signalClosed().
     private final PlainHttpPublisher writePublisher = new PlainHttpPublisher(reading);
     private volatile boolean connected;
     private boolean closed;
@@ -84,7 +84,8 @@
                 boolean finished = chan.finishConnect();
                 assert finished : "Expected channel to be connected";
                 debug.log(Level.DEBUG,
-                          "ConnectEvent: connect finished: %s Local addr: %s", finished, chan.getLocalAddress());
+                          "ConnectEvent: connect finished: %s Local addr: %s",
+                          finished, chan.getLocalAddress());
                 connected = true;
                 // complete async since the event runs on the SelectorManager thread
                 cf.completeAsync(() -> null, client().theExecutor());
@@ -107,7 +108,8 @@
             assert !connected : "Already connected";
             assert !chan.isBlocking() : "Unexpected blocking channel";
             boolean finished = false;
-            PrivilegedExceptionAction<Boolean> pa = () -> chan.connect(address);
+            PrivilegedExceptionAction<Boolean> pa =
+                    () -> chan.connect(Utils.resolveAddress(address));
             try {
                  finished = AccessController.doPrivileged(pa);
             } catch (PrivilegedActionException e) {
@@ -179,14 +181,19 @@
      * Closes this connection
      */
     @Override
-    public synchronized void close() {
-        if (closed) {
-            return;
+    public void close() {
+        synchronized (this) {
+            if (closed) {
+                return;
+            }
+            closed = true;
         }
-        closed = true;
         try {
             Log.logTrace("Closing: " + toString());
+            debug.log(Level.DEBUG, () -> "Closing channel: "
+                    + client().debugInterestOps(chan));
             chan.close();
+            tube.signalClosed();
         } catch (IOException e) {
             Log.logTrace("Closing resulted in " + e);
         }