diff --git a/transport-native-io_uring/src/main/java/io/netty/channel/uring/AbstractIOUringServerChannel.java b/transport-native-io_uring/src/main/java/io/netty/channel/uring/AbstractIOUringServerChannel.java index 2ae51e1407..cb084b17c8 100644 --- a/transport-native-io_uring/src/main/java/io/netty/channel/uring/AbstractIOUringServerChannel.java +++ b/transport-native-io_uring/src/main/java/io/netty/channel/uring/AbstractIOUringServerChannel.java @@ -52,7 +52,7 @@ abstract class AbstractIOUringServerChannel extends AbstractIOUringChannel imple abstract Channel newChildChannel(int fd) throws Exception; - void acceptComplete(int res) { + boolean acceptComplete(int res) { if (res >= 0) { final IOUringRecvByteAllocatorHandle allocHandle = (IOUringRecvByteAllocatorHandle) unsafe() @@ -71,6 +71,7 @@ abstract class AbstractIOUringServerChannel extends AbstractIOUringChannel imple } //Todo refactoring method name executeReadEvent(); + return res >= 0; } final class UringServerChannelUnsafe extends AbstractIOUringChannel.AbstractUringUnsafe { diff --git a/transport-native-io_uring/src/main/java/io/netty/channel/uring/IOUringEventLoop.java b/transport-native-io_uring/src/main/java/io/netty/channel/uring/IOUringEventLoop.java index 77d4af6e68..0839141e22 100644 --- a/transport-native-io_uring/src/main/java/io/netty/channel/uring/IOUringEventLoop.java +++ b/transport-native-io_uring/src/main/java/io/netty/channel/uring/IOUringEventLoop.java @@ -44,8 +44,6 @@ final class IOUringEventLoop extends SingleThreadEventLoop implements private static final long ETIME = -62; static final long ECANCELED = -125; - // events should be unique to identify which event type that was - private long eventIdCounter; private final IntObjectMap channels = new IntObjectHashMap(4096); private final RingBuffer ringBuffer; @@ -191,8 +189,11 @@ final class IOUringEventLoop extends SingleThreadEventLoop implements if (res != -1 && res != ERRNO_EAGAIN_NEGATIVE && res != ERRNO_EWOULDBLOCK_NEGATIVE) { logger.trace("server filedescriptor Fd: {}", fd); - acceptChannel.acceptComplete(res); - pollRdHup(res); + if (acceptChannel.acceptComplete(res)) { + // all childChannels should poll POLLRDHUP + submissionQueue.addPollRdHup(res); + submissionQueue.submit(); + } } break; case IOUring.OP_READ: @@ -247,9 +248,9 @@ final class IOUringEventLoop extends SingleThreadEventLoop implements } else { //Todo error handling error logger.trace("POLL_LINK Res: {}", res); - break; } } + break; case IOUring.OP_POLL_REMOVE: if (res == ENOENT) { logger.trace("POLL_REMOVE OPERATION not permitted"); @@ -282,11 +283,4 @@ final class IOUringEventLoop extends SingleThreadEventLoop implements Native.eventFdWrite(eventfd.intValue(), 1L); } } - - //to be notified when the filedesciptor is closed - private void pollRdHup(int fd) { - //all childChannels should poll POLLRDHUP - ringBuffer.getIoUringSubmissionQueue().addPollRdHup(fd); - ringBuffer.getIoUringSubmissionQueue().submit(); - } }