Fixed issue: NETTY-214 NIO socket / datagram transport sometimes does not shut down

* Fixed a race condition in NioWorker.close() and NioDatagramWorker.close()
This commit is contained in:
Trustin Lee 2009-08-27 04:23:44 +00:00
parent be32586d50
commit 1574fc3188
2 changed files with 16 additions and 10 deletions

View File

@ -648,15 +648,18 @@ class NioDatagramWorker implements Runnable {
final ChannelFuture future) { final ChannelFuture future) {
NioDatagramWorker worker = channel.worker; NioDatagramWorker worker = channel.worker;
Selector selector = worker.selector; Selector selector = worker.selector;
SelectionKey key = channel.getDatagramChannel().keyFor(selector);
if (key != null) {
key.cancel();
}
boolean connected = channel.isConnected(); boolean connected = channel.isConnected();
boolean bound = channel.isBound(); boolean bound = channel.isBound();
try { try {
channel.getDatagramChannel().close(); synchronized (channel.interestOpsLock) {
SelectionKey key = channel.getDatagramChannel().keyFor(selector);
if (key != null) {
key.cancel();
}
channel.getDatagramChannel().close();
}
if (channel.setClosed()) { if (channel.setClosed()) {
future.setSuccess(); future.setSuccess();
if (connected) { if (connected) {

View File

@ -562,15 +562,18 @@ class NioWorker implements Runnable {
static void close(NioSocketChannel channel, ChannelFuture future) { static void close(NioSocketChannel channel, ChannelFuture future) {
NioWorker worker = channel.worker; NioWorker worker = channel.worker;
Selector selector = worker.selector; Selector selector = worker.selector;
SelectionKey key = channel.socket.keyFor(selector);
if (key != null) {
key.cancel();
}
boolean connected = channel.isConnected(); boolean connected = channel.isConnected();
boolean bound = channel.isBound(); boolean bound = channel.isBound();
try { try {
channel.socket.close(); synchronized (channel.interestOpsLock) {
SelectionKey key = channel.socket.keyFor(selector);
if (key != null) {
key.cancel();
}
channel.socket.close();
}
if (channel.setClosed()) { if (channel.setClosed()) {
future.setSuccess(); future.setSuccess();
if (connected) { if (connected) {