8200583: (se) Selector clean-up, part 4

Reviewed-by: bpb, chegar
This commit is contained in:
Alan Bateman 2018-04-05 15:01:57 +01:00
parent 9968548d57
commit d185d65b69
11 changed files with 156 additions and 269 deletions

View file

@ -62,11 +62,9 @@ class KQueueSelectorImpl extends SelectorImpl {
// maps file descriptor to selection key, synchronize on selector
private final Map<Integer, SelectionKeyImpl> fdToKey = new HashMap<>();
// pending new registrations/updates, queued by implRegister and putEventOps
// pending new registrations/updates, queued by setEventOps
private final Object updateLock = new Object();
private final Deque<SelectionKeyImpl> newKeys = new ArrayDeque<>();
private final Deque<SelectionKeyImpl> updateKeys = new ArrayDeque<>();
private final Deque<Integer> updateEvents = new ArrayDeque<>();
// interrupt triggering and clearing
private final Object interruptLock = new Object();
@ -138,30 +136,21 @@ class KQueueSelectorImpl extends SelectorImpl {
}
/**
* Process new registrations and changes to the interest ops.
* Process changes to the interest ops.
*/
private void processUpdateQueue() {
assert Thread.holdsLock(this);
synchronized (updateLock) {
SelectionKeyImpl ski;
// new registrations
while ((ski = newKeys.pollFirst()) != null) {
if (ski.isValid()) {
int fd = ski.channel.getFDVal();
SelectionKeyImpl previous = fdToKey.put(fd, ski);
assert previous == null;
assert ski.registeredEvents() == 0;
}
}
// changes to interest ops
assert updateKeys.size() == updateKeys.size();
while ((ski = updateKeys.pollFirst()) != null) {
int newEvents = updateEvents.pollFirst();
int fd = ski.channel.getFDVal();
if (ski.isValid() && fdToKey.containsKey(fd)) {
if (ski.isValid()) {
int fd = ski.getFDVal();
// add to fdToKey if needed
SelectionKeyImpl previous = fdToKey.putIfAbsent(fd, ski);
assert (previous == null) || (previous == ski);
int newEvents = ski.translateInterestOps();
int registeredEvents = ski.registeredEvents();
if (newEvents != registeredEvents) {
@ -229,16 +218,16 @@ class KQueueSelectorImpl extends SelectorImpl {
if (selectedKeys.contains(ski)) {
// file descriptor may be polled more than once per poll
if (ski.lastPolled != pollCount) {
if (ski.channel.translateAndSetReadyOps(rOps, ski)) {
if (ski.translateAndSetReadyOps(rOps)) {
numKeysUpdated++;
ski.lastPolled = pollCount;
}
} else {
// ready ops have already been set on this update
ski.channel.translateAndUpdateReadyOps(rOps, ski);
ski.translateAndUpdateReadyOps(rOps);
}
} else {
ski.channel.translateAndSetReadyOps(rOps, ski);
ski.translateAndSetReadyOps(rOps);
if ((ski.nioReadyOps() & ski.nioInterestOps()) != 0) {
selectedKeys.add(ski);
numKeysUpdated++;
@ -272,20 +261,12 @@ class KQueueSelectorImpl extends SelectorImpl {
FileDispatcherImpl.closeIntFD(fd1);
}
@Override
protected void implRegister(SelectionKeyImpl ski) {
ensureOpen();
synchronized (updateLock) {
newKeys.addLast(ski);
}
}
@Override
protected void implDereg(SelectionKeyImpl ski) throws IOException {
assert !ski.isValid();
assert Thread.holdsLock(this);
int fd = ski.channel.getFDVal();
int fd = ski.getFDVal();
int registeredEvents = ski.registeredEvents();
if (fdToKey.remove(fd) != null) {
if (registeredEvents != 0) {
@ -301,10 +282,9 @@ class KQueueSelectorImpl extends SelectorImpl {
}
@Override
public void putEventOps(SelectionKeyImpl ski, int events) {
public void setEventOps(SelectionKeyImpl ski) {
ensureOpen();
synchronized (updateLock) {
updateEvents.addLast(events); // events first in case adding key fails
updateKeys.addLast(ski);
}
}