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++; } } }