public int buffer(ByteBuffer buffer) { data = addTo(data, buffer); assert data.remaining() > 0 : channel + " " + data; onBuffer.onBuffer(channel, data); return data.remaining(); }
@Override public void addHandler(final NioChannelHandler handler) { if (onSelectorThread()) { NioFiberImpl.this.synchronousAdd(handler); } else { execute(new Runnable() { @Override public void run() { NioFiberImpl.this.synchronousAdd(handler); } }); } }
@Override public void close(final SelectableChannel channel) { if (onSelectorThread()) { controls.close(channel); } else { execute(new Callback<NioControls>() { @Override public void onMessage(NioControls message) { controls.close(channel); } }); } }
for (SelectionKey key : selectedKeys) { final NioState attachment = (NioState) key.attachment(); NioChannelHandler.Result result = execEvent(key, attachment); switch (result){ case CloseSocket: closeQuietly(attachment.channel); case RemoveHandler: handlers.remove(attachment.channel);
@Override public void execute(final Callback<NioControls> asyncWrite) { execute(new Runnable() { @Override public void run() { asyncWrite.onMessage(controls); } }); }
@Override public NioChannelHandler.Result onSelect(NioFiber nioFiber, NioControls controls, SelectionKey key) { try { writeAll(channel, data); } catch (IOException e) { writeFailed.onFailure(e, channel, data); return Result.CloseSocket; } if (data.remaining() < 1) { onBuffer.onBufferEnd(channel); return Result.RemoveHandler; } return Result.Continue; }
public NioFiberImpl(final NioBatchExecutor executor, Collection<NioChannelHandler> nioHandlers, String threadName, boolean isDaemonThread, WriteFailure writeFailed, OnBuffer onBuffer) { this.executor = executor; this.writeFailed = writeFailed; this.onBuffer = onBuffer; this.scheduler = new SchedulerImpl(this); try { this.selector = Selector.open(); } catch (IOException e) { throw new RuntimeException(e); } for (NioChannelHandler nioHandler : nioHandlers) { synchronousAdd(nioHandler); } queue = new QueueSwapper(selector); thread = new Thread(this, threadName); thread.setDaemon(isDaemonThread); }
public NioChannelHandler.Result onSelect(NioBatchExecutor exec, NioFiberImpl fiber, NioControls controls, SelectionKey key) { int size = handlers.size(); for (int i = 0; i < size; i++) { final NioChannelHandler handler = this.handlers.get(i); final boolean interested = (key.readyOps() & handler.getInterestSet()) != 0; if (interested) { NioChannelHandler.Result result = exec.runOnSelect(fiber, handler, controls, key); switch (result) { case RemoveHandler: if (handlers.size() > 1) { handlers.remove(i--); handler.onEnd(); size--; removeInterestFrom(handler, key); } else { //if no handlers left then the key is going to be cancelled and removed //does not automatically close the socket return NioChannelHandler.Result.RemoveHandler; } break; case CloseSocket: return NioChannelHandler.Result.CloseSocket; } } } return handlers.isEmpty() ? NioChannelHandler.Result.RemoveHandler : NioChannelHandler.Result.Continue; }
@Override public void close(final SelectableChannel channel) { if (onSelectorThread()) { controls.close(channel); } else { execute(new Callback<NioControls>() { @Override public void onMessage(NioControls message) { controls.close(channel); } }); } }
for (SelectionKey key : selectedKeys) { final NioState attachment = (NioState) key.attachment(); NioChannelHandler.Result result = execEvent(key, attachment); switch (result){ case CloseSocket: closeQuietly(attachment.channel); case RemoveHandler: handlers.remove(attachment.channel);
@Override public void execute(final Callback<NioControls> asyncWrite) { execute(new Runnable() { @Override public void run() { asyncWrite.onMessage(controls); } }); }
@Override public NioChannelHandler.Result onSelect(NioFiber nioFiber, NioControls controls, SelectionKey key) { try { writeAll(channel, data); } catch (IOException e) { writeFailed.onFailure(e, channel, data); return Result.CloseSocket; } if (data.remaining() < 1) { onBuffer.onBufferEnd(channel); return Result.RemoveHandler; } return Result.Continue; }
public NioFiberImpl(final NioBatchExecutor executor, Collection<NioChannelHandler> nioHandlers, String threadName, boolean isDaemonThread, WriteFailure writeFailed, OnBuffer onBuffer) { this.executor = executor; this.writeFailed = writeFailed; this.onBuffer = onBuffer; this.scheduler = new SchedulerImpl(this); try { this.selector = Selector.open(); } catch (IOException e) { throw new RuntimeException(e); } for (NioChannelHandler nioHandler : nioHandlers) { synchronousAdd(nioHandler); } queue = new QueueSwapper(selector); thread = new Thread(this, threadName); thread.setDaemon(isDaemonThread); }
public NioChannelHandler.Result onSelect(NioBatchExecutor exec, NioFiberImpl fiber, NioControls controls, SelectionKey key) { int size = handlers.size(); for (int i = 0; i < size; i++) { final NioChannelHandler handler = this.handlers.get(i); final boolean interested = (key.readyOps() & handler.getInterestSet()) != 0; if (interested) { NioChannelHandler.Result result = exec.runOnSelect(fiber, handler, controls, key); switch (result) { case RemoveHandler: if (handlers.size() > 1) { handlers.remove(i--); handler.onEnd(); size--; removeInterestFrom(handler, key); } else { //if no handlers left then the key is going to be cancelled and removed //does not automatically close the socket return NioChannelHandler.Result.RemoveHandler; } break; case CloseSocket: return NioChannelHandler.Result.CloseSocket; } } } return handlers.isEmpty() ? NioChannelHandler.Result.RemoveHandler : NioChannelHandler.Result.Continue; }
@Override public void addHandler(final NioChannelHandler handler) { if (onSelectorThread()) { NioFiberImpl.this.synchronousAdd(handler); } else { execute(new Runnable() { @Override public void run() { NioFiberImpl.this.synchronousAdd(handler); } }); } }
@Override public void dispose() { synchronized (_disposables) { //copy list to prevent concurrent mod for (Disposable r : _disposables.toArray(new Disposable[_disposables.size()])) { r.dispose(); } } scheduler.dispose(); execute(new Runnable() { @Override public void run() { selectorRunning = false; } }); }
try { if (key == null || key.buffer == null) { writeAll(accept, buffer); if (buffer.remaining() == 0) { return;
public int buffer(ByteBuffer buffer) { data = addTo(data, buffer); assert data.remaining() > 0 : channel + " " + data; onBuffer.onBuffer(channel, data); return data.remaining(); }
@Override public void dispose() { synchronized (_disposables) { //copy list to prevent concurrent mod for (Disposable r : _disposables.toArray(new Disposable[_disposables.size()])) { r.dispose(); } } scheduler.dispose(); execute(new Runnable() { @Override public void run() { selectorRunning = false; } }); }
try { if (key == null || key.buffer == null) { writeAll(accept, buffer); if (buffer.remaining() == 0) { return;