final void workaroundSelectorSpin() throws IOException { if (LOGGER.isLoggable(Level.FINE)) { LOGGER.log(Level.FINE, "Workaround selector spin. selector={0}", getSelector()); } spinnedSelectorsHistory.put(getSelector(), System.currentTimeMillis()); switchToNewSelector(); }
protected synchronized void stopSelectorRunners() { if (selectorRunners == null) { return; } for (int i = 0; i < selectorRunners.length; i++) { SelectorRunner runner = selectorRunners[i]; if (runner != null) { runner.stop(); selectorRunners[i] = null; } } selectorRunners = null; }
@Override public boolean run(final SelectorRunner selectorRunner) throws IOException { SelectionKey localSelectionKey = selectionKey; if (IS_WORKAROUND_SELECTOR_SPIN) { localSelectionKey = selectorRunner.checkIfSpinnedKey(selectionKey); } registerKey0(localSelectionKey, interest); return true; }
addThreadNameMarker(currentThread); setRunnerThread(currentThread); Threads.setService(true); while (!isSkipping && !isStop()) { if (transportStateHolder.getState() != State.PAUSED) { isSkipping = !doSelect(); } else { try { runnerThreadActivityCounter.compareAndSet(1, 0); if (isStop()) { stateHolder.set(State.STOPPED); setRunnerThread(null); if (runnerThreadActivityCounter.compareAndSet(0, -1)) { shutdownSelector(); removeThreadNameMarker(currentThread); Threads.setService(false);
@Override public Set<SelectionKey> select(final SelectorRunner selectorRunner) throws IOException { final Selector selector = selectorRunner.getSelector(); final boolean hasPostponedTasks = !selectorRunner.getPostponedTasks().isEmpty(); // The selector.select(...) returns the *new* SelectionKey count, // so it may return 0 even in the case, when there are unprocessed, but // ready SelectionKeys in the Selector's selected key set. if (!hasPostponedTasks) { selector.select(selectTimeout); } else { selector.selectNow(); } final Set<SelectionKey> selectedKeys = selector.selectedKeys(); if (IS_WORKAROUND_SELECTOR_SPIN) { selectorRunner.checkSelectorSpin( !selectedKeys.isEmpty() || hasPostponedTasks, SPIN_RATE_THRESHOLD); } return selectedKeys; }
private void addPendingTask(final SelectorRunner selectorRunner, final SelectorHandlerTask task) { if (selectorRunner == null) { task.cancel(); return; } selectorRunner.addPendingTask(task); if (selectorRunner.isStop() && selectorRunner.getPendingTasks().remove(task)) { task.cancel(); } }
private void shutdownSelector() { final Selector localSelector = getSelector(); if (localSelector != null) { try { abortTasksInQueue(pendingTasks); abortTasksInQueue(evenPostponedTasks); abortTasksInQueue(oddPostponedTasks);
private void wakeupSelector() { final Selector localSelector = getSelector(); if (localSelector != null && selectorWakeupFlag.compareAndSet(false, true)) { try { localSelector.wakeup(); } catch (Exception e) { LOGGER.log(Level.FINE, "Error during selector wakeup", e); } } }
public static SelectorRunner create(final NIOTransport transport) throws IOException { return new SelectorRunner(transport, Selectors.newSelector(transport.getSelectorProvider())); }
@Override public void registerKeyInterest(final SelectorRunner selectorRunner, final SelectionKey key, final int interest) throws IOException { if (isSelectorRunnerThread(selectorRunner)) { registerKey0(key, interest); } else { selectorRunner.addPendingTask(new RegisterKeyTask(key, interest)); } }
addThreadNameMarker(currentThread); setRunnerThread(currentThread); Threads.setService(true); while (!isSkipping && !isStop()) { if (transportStateHolder.getState() != State.PAUSED) { isSkipping = !doSelect(); } else { try { runnerThreadActivityCounter.compareAndSet(1, 0); if (isStop()) { stateHolder.set(State.STOPPED); setRunnerThread(null); if (runnerThreadActivityCounter.compareAndSet(0, -1)) { shutdownSelector(); removeThreadNameMarker(currentThread); Threads.setService(false);
@Override public Set<SelectionKey> select(final SelectorRunner selectorRunner) throws IOException { final Selector selector = selectorRunner.getSelector(); final boolean hasPostponedTasks = !selectorRunner.getPostponedTasks().isEmpty(); // The selector.select(...) returns the *new* SelectionKey count, // so it may return 0 even in the case, when there are unprocessed, but // ready SelectionKeys in the Selector's selected key set. if (!hasPostponedTasks) { selector.select(selectTimeout); } else { selector.selectNow(); } final Set<SelectionKey> selectedKeys = selector.selectedKeys(); if (IS_WORKAROUND_SELECTOR_SPIN) { selectorRunner.checkSelectorSpin( !selectedKeys.isEmpty() || hasPostponedTasks, SPIN_RATE_THRESHOLD); } return selectedKeys; }
private void addPendingTask(final SelectorRunner selectorRunner, final SelectorHandlerTask task) { if (selectorRunner == null) { task.cancel(); return; } selectorRunner.addPendingTask(task); if (selectorRunner.isStop() && selectorRunner.getPendingTasks().remove(task)) { task.cancel(); } }
private void shutdownSelector() { final Selector localSelector = getSelector(); if (localSelector != null) { try { abortTasksInQueue(pendingTasks); abortTasksInQueue(evenPostponedTasks); abortTasksInQueue(oddPostponedTasks);
private void wakeupSelector() { final Selector localSelector = getSelector(); if (localSelector != null && selectorWakeupFlag.compareAndSet(false, true)) { try { localSelector.wakeup(); } catch (Exception e) { LOGGER.log(Level.FINE, "Error during selector wakeup", e); } } }
public static SelectorRunner create(final NIOTransport transport) throws IOException { return new SelectorRunner(transport, Selectors.newSelector(transport.getSelectorProvider())); }
@Override public void registerKeyInterest(final SelectorRunner selectorRunner, final SelectionKey key, final int interest) throws IOException { if (isSelectorRunnerThread(selectorRunner)) { registerKey0(key, interest); } else { selectorRunner.addPendingTask(new RegisterKeyTask(key, interest)); } }
addThreadNameMarker(currentThread); setRunnerThread(currentThread); Threads.setService(true); while (!isSkipping && !isStop()) { if (transportStateHolder.getState() != State.PAUSED) { isSkipping = !doSelect(); } else { try { runnerThreadActivityCounter.compareAndSet(1, 0); if (isStop()) { stateHolder.set(State.STOPPED); setRunnerThread(null); if (runnerThreadActivityCounter.compareAndSet(0, -1)) { shutdownSelector(); removeThreadNameMarker(currentThread); Threads.setService(false);