src/java.base/solaris/classes/sun/nio/ch/DevPollSelectorImpl.java
Print this page
*** 27,37 ****
import java.io.IOException;
import java.nio.channels.*;
import java.nio.channels.spi.*;
import java.util.*;
! import sun.misc.*;
/**
* An implementation of Selector for Solaris.
*/
--- 27,37 ----
import java.io.IOException;
import java.nio.channels.*;
import java.nio.channels.spi.*;
import java.util.*;
! import java.util.function.Consumer;
/**
* An implementation of Selector for Solaris.
*/
*** 50,62 ****
private Map<Integer,SelectionKeyImpl> fdToKey;
// True if this Selector has been closed
private boolean closed = false;
- // Lock for close/cleanup
- private Object closeLock = new Object();
-
// Lock for interrupt triggering and clearing
private Object interruptLock = new Object();
private boolean interruptTriggered = false;
/**
--- 50,59 ----
*** 68,104 ****
long pipeFds = IOUtil.makePipe(false);
fd0 = (int) (pipeFds >>> 32);
fd1 = (int) pipeFds;
pollWrapper = new DevPollArrayWrapper();
pollWrapper.initInterrupt(fd0, fd1);
! fdToKey = new HashMap<Integer,SelectionKeyImpl>();
}
! protected int doSelect(long timeout)
! throws IOException
! {
! if (closed)
! throw new ClosedSelectorException();
! processDeregisterQueue();
try {
! begin();
! pollWrapper.poll(timeout);
} finally {
! end();
}
! processDeregisterQueue();
! int numKeysUpdated = updateSelectedKeys();
if (pollWrapper.interrupted()) {
// Clear the wakeup pipe
pollWrapper.putReventOps(pollWrapper.interruptedIndex(), 0);
synchronized (interruptLock) {
pollWrapper.clearInterrupted();
IOUtil.drain(fd0);
interruptTriggered = false;
}
}
! return numKeysUpdated;
}
/**
* Update the keys whose fd's have been selected by the devpoll
* driver. Add the ready keys to the ready queue.
--- 65,135 ----
long pipeFds = IOUtil.makePipe(false);
fd0 = (int) (pipeFds >>> 32);
fd1 = (int) pipeFds;
pollWrapper = new DevPollArrayWrapper();
pollWrapper.initInterrupt(fd0, fd1);
! fdToKey = new HashMap<>();
}
! @Override
! protected int doSelect(long timeout) throws IOException {
! pollDevPollWrapper(timeout);
try {
! return updateSelectedKeys();
} finally {
! clearWakeupPipeIfInterrupted();
}
! }
!
! @Override
! protected int doSelect(Consumer<SelectionKey> handler, long timeout) throws IOException {
! pollDevPollWrapper(timeout);
! try {
! int entries = pollWrapper.updated;
! int numKeysUpdated = 0;
! for (int i=0; i<entries; i++) {
! int nextFD = pollWrapper.getDescriptor(i);
! SelectionKeyImpl ski = fdToKey.get(Integer.valueOf(nextFD));
! // ski is null in the case of an interrupt
! if (ski != null) {
! int rOps = pollWrapper.getReventOps(i);
! ski.channel.translateAndSetReadyOps(rOps, ski);
! if (ski.hasOps()) {
! handler.accept(ski);
! numKeysUpdated++;
! }
! }
! }
! return numKeysUpdated;
! } finally {
! clearWakeupPipeIfInterrupted();
! }
! }
!
! private void clearWakeupPipeIfInterrupted() throws IOException {
if (pollWrapper.interrupted()) {
// Clear the wakeup pipe
pollWrapper.putReventOps(pollWrapper.interruptedIndex(), 0);
synchronized (interruptLock) {
pollWrapper.clearInterrupted();
IOUtil.drain(fd0);
interruptTriggered = false;
}
}
! }
!
! private void pollDevPollWrapper(long timeout) throws ClosedSelectorException, IOException {
! if (closed)
! throw new ClosedSelectorException();
! processDeregisterQueue();
! try {
! begin();
! pollWrapper.poll(timeout);
! } finally {
! end();
! }
! processDeregisterQueue();
}
/**
* Update the keys whose fd's have been selected by the devpoll
* driver. Add the ready keys to the ready queue.
*** 116,126 ****
if (ski.channel.translateAndSetReadyOps(rOps, ski)) {
numKeysUpdated++;
}
} else {
ski.channel.translateAndSetReadyOps(rOps, ski);
! if ((ski.nioReadyOps() & ski.nioInterestOps()) != 0) {
selectedKeys.add(ski);
numKeysUpdated++;
}
}
}
--- 147,157 ----
if (ski.channel.translateAndSetReadyOps(rOps, ski)) {
numKeysUpdated++;
}
} else {
ski.channel.translateAndSetReadyOps(rOps, ski);
! if (ski.hasOps()) {
selectedKeys.add(ski);
numKeysUpdated++;
}
}
}