提交 6e708e35 编写于 作者: A alanb

6944810: (ch) Assert failure in sun.nio.ch.PendingIoCache.clearPendingIoMap [win]

Reviewed-by: chegar
上级 80aee3ba
...@@ -48,7 +48,7 @@ import java.util.Collections; ...@@ -48,7 +48,7 @@ import java.util.Collections;
* *
* <p> An asynchronous file channel does not have a <i>current position</i> * <p> An asynchronous file channel does not have a <i>current position</i>
* within the file. Instead, the file position is specified to each read and * within the file. Instead, the file position is specified to each read and
* write methd that initiate asynchronous operations. A {@link CompletionHandler} * write method that initiates asynchronous operations. A {@link CompletionHandler}
* is specified as a parameter and is invoked to consume the result of the I/O * is specified as a parameter and is invoked to consume the result of the I/O
* operation. This class also defines read and write methods that initiate * operation. This class also defines read and write methods that initiate
* asynchronous operations, returning a {@link Future} to represent the pending * asynchronous operations, returning a {@link Future} to represent the pending
...@@ -73,7 +73,7 @@ import java.util.Collections; ...@@ -73,7 +73,7 @@ import java.util.Collections;
* which tasks are submitted to handle I/O events and dispatch to completion * which tasks are submitted to handle I/O events and dispatch to completion
* handlers that consume the results of I/O operations on the channel. The * handlers that consume the results of I/O operations on the channel. The
* completion handler for an I/O operation initiated on a channel is guaranteed * completion handler for an I/O operation initiated on a channel is guaranteed
* to be invoked by one threads in the thread pool (This ensures that the * to be invoked by one of the threads in the thread pool (This ensures that the
* completion handler is run by a thread with the expected <em>identity</em>). * completion handler is run by a thread with the expected <em>identity</em>).
* Where an I/O operation completes immediately, and the initiating thread is * Where an I/O operation completes immediately, and the initiating thread is
* itself a thread in the thread pool, then the completion handler may be invoked * itself a thread in the thread pool, then the completion handler may be invoked
......
...@@ -110,8 +110,7 @@ class PendingIoCache { ...@@ -110,8 +110,7 @@ class PendingIoCache {
if (closed) if (closed)
return; return;
// handle the case that where there are I/O operations that have // handle case where I/O operations that have not completed.
// not completed.
if (!pendingIoMap.isEmpty()) if (!pendingIoMap.isEmpty())
clearPendingIoMap(); clearPendingIoMap();
...@@ -132,7 +131,9 @@ class PendingIoCache { ...@@ -132,7 +131,9 @@ class PendingIoCache {
closePending = true; closePending = true;
try { try {
this.wait(50); this.wait(50);
} catch (InterruptedException x) { } } catch (InterruptedException x) {
Thread.currentThread().interrupt();
}
closePending = false; closePending = false;
if (pendingIoMap.isEmpty()) if (pendingIoMap.isEmpty())
return; return;
......
...@@ -439,6 +439,7 @@ public class WindowsAsynchronousFileChannelImpl ...@@ -439,6 +439,7 @@ public class WindowsAsynchronousFileChannelImpl
address = ((DirectBuffer)buf).address(); address = ((DirectBuffer)buf).address();
} }
boolean pending = false;
try { try {
begin(); begin();
...@@ -449,6 +450,7 @@ public class WindowsAsynchronousFileChannelImpl ...@@ -449,6 +450,7 @@ public class WindowsAsynchronousFileChannelImpl
n = readFile(handle, address, rem, position, overlapped); n = readFile(handle, address, rem, position, overlapped);
if (n == IOStatus.UNAVAILABLE) { if (n == IOStatus.UNAVAILABLE) {
// I/O is pending // I/O is pending
pending = true;
return; return;
} else if (n == IOStatus.EOF) { } else if (n == IOStatus.EOF) {
result.setResult(n); result.setResult(n);
...@@ -460,14 +462,15 @@ public class WindowsAsynchronousFileChannelImpl ...@@ -460,14 +462,15 @@ public class WindowsAsynchronousFileChannelImpl
// failed to initiate read // failed to initiate read
result.setFailure(toIOException(x)); result.setFailure(toIOException(x));
} finally { } finally {
if (!pending) {
// release resources
if (overlapped != 0L)
ioCache.remove(overlapped);
releaseBufferIfSubstituted();
}
end(); end();
} }
// release resources
if (overlapped != 0L)
ioCache.remove(overlapped);
releaseBufferIfSubstituted();
// invoke completion handler // invoke completion handler
Invoker.invoke(result); Invoker.invoke(result);
} }
......
...@@ -239,14 +239,14 @@ class WindowsAsynchronousSocketChannelImpl ...@@ -239,14 +239,14 @@ class WindowsAsynchronousSocketChannelImpl
result.setResult(null); result.setResult(null);
} }
} catch (Throwable x) { } catch (Throwable x) {
if (overlapped != 0L)
ioCache.remove(overlapped);
exc = x; exc = x;
} finally { } finally {
end(); end();
} }
if (exc != null) { if (exc != null) {
if (overlapped != 0L)
ioCache.remove(overlapped);
closeChannel(); closeChannel();
result.setFailure(toIOException(exc)); result.setFailure(toIOException(exc));
} }
......
...@@ -380,30 +380,9 @@ java/io/File/MaxPathLength.java windows-all ...@@ -380,30 +380,9 @@ java/io/File/MaxPathLength.java windows-all
# jdk_nio # jdk_nio
# 6944810
java/nio/channels/FileChannel/ReleaseOnCloseDeadlock.java windows-all
# 6963118 # 6963118
java/nio/channels/Selector/Wakeup.java windows-all java/nio/channels/Selector/Wakeup.java windows-all
# The asynchronous I/O implementation on Windows requires Windows XP or newer.
# We can remove the following once all Windows 2000 machines have been
# decommissioned.
java/nio/channels/AsynchronousChannelGroup/Basic.java windows-5.0
java/nio/channels/AsynchronousChannelGroup/GroupOfOne.java windows-5.0
java/nio/channels/AsynchronousChannelGroup/Identity.java windows-5.0
java/nio/channels/AsynchronousChannelGroup/Restart.java windows-5.0
java/nio/channels/AsynchronousChannelGroup/Unbounded.java windows-5.0
java/nio/channels/AsynchronousDatagramChannel/Basic.java windows-5.0
java/nio/channels/AsynchronousFileChannel/Lock.java windows-5.0
java/nio/channels/AsynchronousServerSocketChannel/Basic.java windows-5.0
java/nio/channels/AsynchronousServerSocketChannel/WithSecurityManager.java windows-5.0
java/nio/channels/AsynchronousSocketChannel/Basic.java windows-5.0
java/nio/channels/AsynchronousSocketChannel/DieBeforeComplete.java windows-5.0
java/nio/channels/AsynchronousSocketChannel/Leaky.java windows-5.0
java/nio/channels/AsynchronousSocketChannel/StressLoopback.java windows-5.0
java/nio/channels/Channels/Basic2.java windows-5.0
# 6959891 # 6959891
com/sun/nio/sctp/SctpChannel/SocketOptionTests.java com/sun/nio/sctp/SctpChannel/SocketOptionTests.java
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册