8199433: (se) select(Consumer<SelectionKey> action) as alternative to selected-key set

Reviewed-by: bpb
This commit is contained in:
Alan Bateman 2018-06-16 10:10:54 +01:00
parent 4a24d95917
commit db61a602f6
10 changed files with 1188 additions and 157 deletions

View file

@ -27,6 +27,7 @@ package sun.nio.ch;
import java.io.IOException;
import java.nio.channels.ClosedSelectorException;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.spi.SelectorProvider;
import java.util.ArrayDeque;
@ -34,6 +35,7 @@ import java.util.Deque;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
import static sun.nio.ch.DevPollArrayWrapper.NUM_POLLFDS;
import static sun.nio.ch.DevPollArrayWrapper.POLLREMOVE;
@ -85,7 +87,9 @@ class DevPollSelectorImpl
}
@Override
protected int doSelect(long timeout) throws IOException {
protected int doSelect(Consumer<SelectionKey> action, long timeout)
throws IOException
{
assert Thread.holdsLock(this);
long to = timeout;
@ -117,7 +121,7 @@ class DevPollSelectorImpl
end(blocking);
}
processDeregisterQueue();
return updateSelectedKeys(numEntries);
return processEvents(numEntries, action);
}
/**
@ -165,13 +169,13 @@ class DevPollSelectorImpl
}
/**
* Update the keys of file descriptors that were polled and add them to
* the selected-key set.
* Process the polled events.
* If the interrupt fd has been selected, drain it and clear the interrupt.
*/
private int updateSelectedKeys(int numEntries) throws IOException {
private int processEvents(int numEntries, Consumer<SelectionKey> action)
throws IOException
{
assert Thread.holdsLock(this);
assert Thread.holdsLock(nioSelectedKeys());
boolean interrupted = false;
int numKeysUpdated = 0;
@ -183,17 +187,7 @@ class DevPollSelectorImpl
SelectionKeyImpl ski = fdToKey.get(fd);
if (ski != null) {
int rOps = pollWrapper.getReventOps(i);
if (selectedKeys.contains(ski)) {
if (ski.translateAndUpdateReadyOps(rOps)) {
numKeysUpdated++;
}
} else {
ski.translateAndSetReadyOps(rOps);
if ((ski.nioReadyOps() & ski.nioInterestOps()) != 0) {
selectedKeys.add(ski);
numKeysUpdated++;
}
}
numKeysUpdated += processReadyEvents(rOps, ski, action);
}
}
}