src/windows/classes/sun/nio/ch/WindowsAsynchronousSocketChannelImpl.java
Print this page
@@ -473,52 +473,43 @@
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) {
+ // initiate read
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);
- }
+ if (n == IOStatus.EOF) {
+ // input shutdown
enableReading();
-
if (scatteringRead) {
- result.setResult((V)Long.valueOf(n));
+ result.setResult((V)Long.valueOf(-1L));
} else {
- result.setResult((V)Integer.valueOf(n));
+ result.setResult((V)Integer.valueOf(-1));
}
+ } else {
+ throw new InternalError("Read completed immediately");
}
} catch (Throwable x) {
- // failed to initiate read:
- // 1. reset read flag
- // 2. free resources
- // 3. release waiters
+ // failed to initiate read
+ // reset read flag before releasing 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
+ // release resources if I/O not pending
+ if (!pending) {
+ if (overlapped != 0L)
+ ioCache.remove(overlapped);
+ if (prepared)
releaseBuffers();
}
end();
}
@@ -719,11 +710,10 @@
}
@Override
@SuppressWarnings("unchecked")
public void run() {
- int n = -1;
long overlapped = 0L;
boolean prepared = false;
boolean pending = false;
boolean shutdown = false;
@@ -734,59 +724,37 @@
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);
+ int 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));
- }
- }
+ // write completed immediately
+ throw new InternalError("Write completed immediately");
} catch (Throwable x) {
+ // write failed. Enable writing before releasing waiters.
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
+ } finally {
+ // release resources if I/O not pending
+ if (!pending) {
if (overlapped != 0L)
ioCache.remove(overlapped);
-
- } finally {
- if (prepared && !pending) {
- // return direct buffer(s) to cache if substituted
+ if (prepared)
releaseBuffers();
}
end();
}