diff --git a/src/aix/classes/sun/nio/ch/AixPollPort.java b/src/aix/classes/sun/nio/ch/AixPollPort.java index 2db99a77b3ea63f3e19e7fb0e3e0357c0be5d187..a7a954597e5a192d718e9358841145b981939093 100644 --- a/src/aix/classes/sun/nio/ch/AixPollPort.java +++ b/src/aix/classes/sun/nio/ch/AixPollPort.java @@ -107,6 +107,7 @@ final class AixPollPort private final ArrayBlockingQueue queue; private final Event NEED_TO_POLL = new Event(null, 0); private final Event EXECUTE_TASK_OR_SHUTDOWN = new Event(null, 0); + private final Event CONTINUE_AFTER_CTL_EVENT = new Event(null, 0); // encapsulates a pollset control event for a file descriptor static class ControlEvent { @@ -342,7 +343,11 @@ final class AixPollPort // To emulate one shot semantic we need to remove // the file descriptor here. - pollsetCtl(pollset, PS_DELETE, fd, 0); + if (fd != sp[0] && fd != ctlSp[0]) { + synchronized (controlQueue) { + pollsetCtl(pollset, PS_DELETE, fd, 0); + } + } // wakeup if (fd == sp[0]) { @@ -351,10 +356,6 @@ final class AixPollPort drain1(sp[0]); } - // This is the only file descriptor without - // one shot semantic => register it again. - pollsetCtl(pollset, PS_ADD, sp[0], Net.POLLIN); - // queue special event if there are more events // to handle. if (n > 0) { @@ -368,12 +369,12 @@ final class AixPollPort if (fd == ctlSp[0]) { synchronized (controlQueue) { drain1(ctlSp[0]); - // This file descriptor does not have - // one shot semantic => register it again. - pollsetCtl(pollset, PS_ADD, ctlSp[0], Net.POLLIN); processControlQueue(); } - continue; + if (n > 0) { + continue; + } + return CONTINUE_AFTER_CTL_EVENT; } PollableChannel channel = fdToChannel.get(fd); @@ -431,6 +432,11 @@ final class AixPollPort continue; } + // contine after we processed a control event + if (ev == CONTINUE_AFTER_CTL_EVENT) { + continue; + } + // handle wakeup to execute task or shutdown if (ev == EXECUTE_TASK_OR_SHUTDOWN) { Runnable task = pollTask();