private void processTaskQueue() { for (;;) { final Runnable task = taskQueue.poll(); if (task == null) { break; } task.run(); try { cleanUpCancelledKeys(); } catch (IOException e) { // Ignore } } }
int selected = select(selector); if (selected == 0 && !wakenupFromLoop && !wakenUp.get()) { long timeBlocked = System.nanoTime() - beforeSelect; rebuildSelector(); selector = this.selector; selectReturnsImmediately = 0; processTaskQueue(); selector = this.selector; // processTaskQueue() can call rebuildSelector() processTaskQueue(); close(k); break; } else { process(selector);
public void register(Channel channel, ChannelFuture future) { Runnable task = createRegisterTask(channel, future); registerTask(task); }
public void rebuildSelector() { if (!isIoThread()) { taskQueue.add(new Runnable() { public void run() { } catch (Exception e) { logger.warn("Failed to re-register a Channel to the new Selector,", e); close(key);
boolean wakenupFromLoop = false; boolean quickSelect = false; long maximumProcessTaskQueueNanos = getMaximumProcessTaskQueueTimeNanos(); for (;;) { wakenUp.set(false); int selected = select(selector, quickSelect); rebuildSelector(); selector = this.selector; selectReturnsImmediately = 0; if (maximumProcessTaskQueueNanos > 0) { long deadlineNanos = System.nanoTime() + maximumProcessTaskQueueNanos; quickSelect = processTaskQueue(deadlineNanos); processTaskQueue(); processTaskQueue(); close(k); } catch (Throwable e) { logger.warn("Failed to close a selection key.", e); break; } else { process(selector); processRead();
AbstractNioSelector(Executor executor, ThreadNameDeterminer determiner) { this.executor = executor; openSelector(determiner); }
public void run() { rebuildSelector(); } });
public void shutdown() { if (isIoThread()) { throw new IllegalStateException("Must not be called from a I/O-Thread to prevent deadlocks!"); } Selector selector = this.selector; shutdown = true; if (selector != null) { selector.wakeup(); } try { shutdownLatch.await(); } catch (InterruptedException e) { logger.error("Interrupted while wait for resources to be released #" + id); Thread.currentThread().interrupt(); } }
/** * Start the {@link AbstractNioWorker} and return the {@link Selector} that will be used for * the {@link AbstractNioChannel}'s when they get registered */ private void openSelector(ThreadNameDeterminer determiner) { try { selector = SelectorUtil.open(); } catch (Throwable t) { throw new ChannelException("Failed to create a selector.", t); } // Start the worker thread with the new Selector. boolean success = false; try { DeadLockProofWorker.start(executor, newThreadRenamingRunnable(id, determiner)); success = true; } finally { if (!success) { // Release the Selector if the execution fails. try { selector.close(); } catch (Throwable t) { logger.warn("Failed to close a selector.", t); } selector = null; // The method will return to the caller at this point. } } assert selector != null && selector.isOpen(); }
public void rebuildSelector() { if (!isIoThread()) { taskQueue.add(new Runnable() { public void run() { } catch (Exception e) { logger.warn("Failed to re-register a Channel to the new Selector,", e); close(key);
public AbstractNioSelector(Executor executor, ThreadNameDeterminer determiner) { this.executor = executor; openSelector(determiner); }
@Override public void run() { rebuildSelector(); } });
public void shutdown() { if (isIoThread()) { throw new IllegalStateException("Must not be called from a I/O-Thread to prevent deadlocks!"); } Selector selector = this.selector; shutdown = true; if (selector != null) { selector.wakeup(); } try { shutdownLatch.await(); } catch (InterruptedException e) { logger.error("Interrupted while wait for resources to be released #" + id); Thread.currentThread().interrupt(); } }
/** * Start the {@link AbstractNioWorker} and return the {@link Selector} that will be used for * the {@link AbstractNioChannel}'s when they get registered */ private void openSelector(ThreadNameDeterminer determiner) { try { selector = SelectorUtil.open(); } catch (Throwable t) { throw new ChannelException("Failed to create a selector.", t); } // Start the worker thread with the new Selector. boolean success = false; try { DeadLockProofWorker.start(executor, newThreadRenamingRunnable(id, determiner)); success = true; } finally { if (!success) { // Release the Selector if the execution fails. try { selector.close(); } catch (Throwable t) { logger.warn("Failed to close a selector.", t); } selector = null; // The method will return to the caller at this point. } } assert selector != null && selector.isOpen(); }
int selected = select(selector); if (SelectorUtil.EPOLL_BUG_WORKAROUND && selected == 0 && !wakenupFromLoop && !wakenUp.get()) { long timeBlocked = System.nanoTime() - beforeSelect; rebuildSelector(); selector = this.selector; selectReturnsImmediately = 0; processTaskQueue(); selector = this.selector; // processTaskQueue() can call rebuildSelector() processTaskQueue(); close(k); break; } else { process(selector);
@Override public void register(Channel channel, ChannelFuture future) { Runnable task = createRegisterTask(channel, future); registerTask(task); }
@Override public void rebuildSelector() { if (!isIoThread()) { taskQueue.add(new Runnable() { @Override } catch (Exception e) { logger.warn("Failed to re-register a Channel to the new Selector,", e); close(key);
private void processTaskQueue() { for (;;) { final Runnable task = taskQueue.poll(); if (task == null) { break; } task.run(); try { cleanUpCancelledKeys(); } catch (IOException e) { // Ignore } } }
AbstractNioSelector(Executor executor, ThreadNameDeterminer determiner) { this.executor = executor; openSelector(determiner); }
public void run() { rebuildSelector(); } });