src/windows/classes/sun/nio/ch/PipeImpl.java

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 79,118 **** public Void run() throws IOException { ServerSocketChannel ssc = null; SocketChannel sc1 = null; SocketChannel sc2 = null; - try { // loopback address InetAddress lb = InetAddress.getByName("127.0.0.1"); assert(lb.isLoopbackAddress()); ! // bind ServerSocketChannel to a port on the loopback address ssc = ServerSocketChannel.open(); ssc.socket().bind(new InetSocketAddress(lb, 0)); // Establish connection (assumes connections are eagerly // accepted) ! InetSocketAddress sa ! = new InetSocketAddress(lb, ssc.socket().getLocalPort()); sc1 = SocketChannel.open(sa); ByteBuffer bb = ByteBuffer.allocate(8); long secret = rnd.nextLong(); bb.putLong(secret).flip(); sc1.write(bb); // Get a connection and verify it is legitimate ! for (;;) { sc2 = ssc.accept(); bb.clear(); sc2.read(bb); bb.rewind(); if (bb.getLong() == secret) break; sc2.close(); } // Create source and sink channels source = new SourceChannelImpl(sp, sc1); sink = new SinkChannelImpl(sp, sc2); } catch (IOException e) { --- 79,141 ---- public Void run() throws IOException { ServerSocketChannel ssc = null; SocketChannel sc1 = null; SocketChannel sc2 = null; // loopback address InetAddress lb = InetAddress.getByName("127.0.0.1"); assert(lb.isLoopbackAddress()); + InetSocketAddress sa = null; + boolean interrupted = false; ! try { ! for(;;) { ! // bind ServerSocketChannel to a port on the loopback ! // address ! if (ssc == null || !ssc.isOpen()) { ssc = ServerSocketChannel.open(); ssc.socket().bind(new InetSocketAddress(lb, 0)); + sa = new InetSocketAddress(lb, + ssc.socket().getLocalPort()); + } + assert(sa != null); // Establish connection (assumes connections are eagerly // accepted) ! try { sc1 = SocketChannel.open(sa); + } catch (ClosedByInterruptException cie) { + interrupted = Thread.interrupted(); + } + if (sc1 != null && sc1.isConnected()) { ByteBuffer bb = ByteBuffer.allocate(8); long secret = rnd.nextLong(); bb.putLong(secret).flip(); sc1.write(bb); // Get a connection and verify it is legitimate ! try { sc2 = ssc.accept(); + } catch (ClosedByInterruptException cie) { + interrupted = Thread.interrupted(); + } + + if (sc2 != null && sc2.isConnected()) { bb.clear(); sc2.read(bb); bb.rewind(); if (bb.getLong() == secret) break; sc2.close(); } + sc1.close(); + } + } + + if (interrupted) + Thread.currentThread().interrupt(); // Create source and sink channels source = new SourceChannelImpl(sp, sc1); sink = new SinkChannelImpl(sp, sc2); } catch (IOException e) {