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

Print this page

        

*** 473,524 **** prepared = true; // get an OVERLAPPED structure (from the cache or allocate) overlapped = ioCache.add(result); ! // synchronize on result to allow this thread handle the case ! // where the read completes immediately. ! synchronized (result) { int n = read0(handle, numBufs, readBufferArray, overlapped); if (n == IOStatus.UNAVAILABLE) { // I/O is pending pending = true; return; } ! // read completed immediately: ! // 1. update buffer position ! // 2. reset read flag ! // 3. release waiters ! if (n == 0) { ! n = -1; ! } else { ! updateBuffers(n); ! } enableReading(); - if (scatteringRead) { ! result.setResult((V)Long.valueOf(n)); } else { ! result.setResult((V)Integer.valueOf(n)); } } } catch (Throwable x) { ! // failed to initiate read: ! // 1. reset read flag ! // 2. free resources ! // 3. release waiters enableReading(); - if (overlapped != 0L) - ioCache.remove(overlapped); if (x instanceof ClosedChannelException) x = new AsynchronousCloseException(); if (!(x instanceof IOException)) x = new IOException(x); result.setFailure(x); } finally { ! if (prepared && !pending) { ! // return direct buffer(s) to cache if substituted releaseBuffers(); } end(); } --- 473,515 ---- prepared = true; // get an OVERLAPPED structure (from the cache or allocate) overlapped = ioCache.add(result); ! // initiate read int n = read0(handle, numBufs, readBufferArray, overlapped); if (n == IOStatus.UNAVAILABLE) { // I/O is pending pending = true; return; } ! if (n == IOStatus.EOF) { ! // input shutdown enableReading(); if (scatteringRead) { ! result.setResult((V)Long.valueOf(-1L)); } else { ! result.setResult((V)Integer.valueOf(-1)); } + } else { + throw new InternalError("Read completed immediately"); } } catch (Throwable x) { ! // failed to initiate read ! // reset read flag before releasing waiters enableReading(); if (x instanceof ClosedChannelException) x = new AsynchronousCloseException(); if (!(x instanceof IOException)) x = new IOException(x); result.setFailure(x); } finally { ! // release resources if I/O not pending ! if (!pending) { ! if (overlapped != 0L) ! ioCache.remove(overlapped); ! if (prepared) releaseBuffers(); } end(); }
*** 719,729 **** } @Override @SuppressWarnings("unchecked") public void run() { - int n = -1; long overlapped = 0L; boolean prepared = false; boolean pending = false; boolean shutdown = false; --- 710,719 ----
*** 734,792 **** prepareBuffers(); prepared = true; // get an OVERLAPPED structure (from the cache or allocate) overlapped = ioCache.add(result); ! ! // synchronize on result to allow this thread handle the case ! // where the read completes immediately. ! synchronized (result) { ! n = write0(handle, numBufs, writeBufferArray, overlapped); if (n == IOStatus.UNAVAILABLE) { // I/O is pending pending = true; return; } - - enableWriting(); - if (n == IOStatus.EOF) { // special case for shutdown output shutdown = true; throw new ClosedChannelException(); } ! ! // write completed immediately: ! // 1. enable writing ! // 2. update buffer position ! // 3. release waiters ! updateBuffers(n); ! ! // result is a Long or Integer ! if (gatheringWrite) { ! result.setResult((V)Long.valueOf(n)); ! } else { ! result.setResult((V)Integer.valueOf(n)); ! } ! } } catch (Throwable x) { enableWriting(); - - // failed to initiate read: if (!shutdown && (x instanceof ClosedChannelException)) x = new AsynchronousCloseException(); if (!(x instanceof IOException)) x = new IOException(x); result.setFailure(x); ! ! // release resources if (overlapped != 0L) ioCache.remove(overlapped); ! ! } finally { ! if (prepared && !pending) { ! // return direct buffer(s) to cache if substituted releaseBuffers(); } end(); } --- 724,760 ---- prepareBuffers(); prepared = true; // get an OVERLAPPED structure (from the cache or allocate) overlapped = ioCache.add(result); ! int n = write0(handle, numBufs, writeBufferArray, overlapped); if (n == IOStatus.UNAVAILABLE) { // I/O is pending pending = true; return; } if (n == IOStatus.EOF) { // special case for shutdown output shutdown = true; throw new ClosedChannelException(); } ! // write completed immediately ! throw new InternalError("Write completed immediately"); } catch (Throwable x) { + // write failed. Enable writing before releasing waiters. enableWriting(); if (!shutdown && (x instanceof ClosedChannelException)) x = new AsynchronousCloseException(); if (!(x instanceof IOException)) x = new IOException(x); result.setFailure(x); ! } finally { ! // release resources if I/O not pending ! if (!pending) { if (overlapped != 0L) ioCache.remove(overlapped); ! if (prepared) releaseBuffers(); } end(); }