diff --git a/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramWorker.java b/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramWorker.java index 3b914d5762..d587e1c5bc 100644 --- a/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramWorker.java +++ b/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramWorker.java @@ -648,15 +648,18 @@ class NioDatagramWorker implements Runnable { final ChannelFuture future) { NioDatagramWorker worker = channel.worker; Selector selector = worker.selector; - SelectionKey key = channel.getDatagramChannel().keyFor(selector); - if (key != null) { - key.cancel(); - } boolean connected = channel.isConnected(); boolean bound = channel.isBound(); try { - channel.getDatagramChannel().close(); + synchronized (channel.interestOpsLock) { + SelectionKey key = channel.getDatagramChannel().keyFor(selector); + if (key != null) { + key.cancel(); + } + channel.getDatagramChannel().close(); + } + if (channel.setClosed()) { future.setSuccess(); if (connected) { diff --git a/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java b/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java index f9910062ab..305fcfdc6d 100644 --- a/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java +++ b/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java @@ -562,15 +562,18 @@ class NioWorker implements Runnable { static void close(NioSocketChannel channel, ChannelFuture future) { NioWorker worker = channel.worker; Selector selector = worker.selector; - SelectionKey key = channel.socket.keyFor(selector); - if (key != null) { - key.cancel(); - } boolean connected = channel.isConnected(); boolean bound = channel.isBound(); try { - channel.socket.close(); + synchronized (channel.interestOpsLock) { + SelectionKey key = channel.socket.keyFor(selector); + if (key != null) { + key.cancel(); + } + channel.socket.close(); + } + if (channel.setClosed()) { future.setSuccess(); if (connected) {