diff --git a/transport-native-epoll/src/main/java/io/netty/channel/epoll/AbstractEpollChannel.java b/transport-native-epoll/src/main/java/io/netty/channel/epoll/AbstractEpollChannel.java index 9d05eab2e9..15f9b18fea 100644 --- a/transport-native-epoll/src/main/java/io/netty/channel/epoll/AbstractEpollChannel.java +++ b/transport-native-epoll/src/main/java/io/netty/channel/epoll/AbstractEpollChannel.java @@ -102,17 +102,29 @@ abstract class AbstractEpollChannel extends AbstractChannel implements UnixChann @Override protected void doClose() throws Exception { - active = false; + boolean active = this.active; + this.active = false; + FileDescriptor fd = fileDescriptor; try { - // deregister from epoll now + // deregister from epoll now and shutdown the socket. doDeregister(); + if (active) { + shutdown(fd.intValue()); + } } finally { // Ensure the file descriptor is closed in all cases. - FileDescriptor fd = fileDescriptor; fd.close(); } } + /** + * Called on {@link #doClose()} before the actual {@link FileDescriptor} is closed. + * This implementation does nothing. + */ + protected void shutdown(int fd) throws IOException { + // NOOP + } + @Override protected void doDisconnect() throws Exception { doClose(); diff --git a/transport-native-epoll/src/main/java/io/netty/channel/epoll/AbstractEpollStreamChannel.java b/transport-native-epoll/src/main/java/io/netty/channel/epoll/AbstractEpollStreamChannel.java index ceb7c7cac0..fbcec8ff12 100644 --- a/transport-native-epoll/src/main/java/io/netty/channel/epoll/AbstractEpollStreamChannel.java +++ b/transport-native-epoll/src/main/java/io/netty/channel/epoll/AbstractEpollStreamChannel.java @@ -93,6 +93,11 @@ public abstract class AbstractEpollStreamChannel extends AbstractEpollChannel { flags |= Native.EPOLLRDHUP; } + @Override + protected void shutdown(int fd) throws IOException { + Native.shutdown(fd, true, true); + } + @Override protected AbstractEpollUnsafe newUnsafe() { return new EpollStreamUnsafe();