public void executeInIoThread(Runnable task) { executeInIoThread(task, false); }
@Override public ChannelFuture execute(ChannelPipeline pipeline, final Runnable task) { Channel ch = pipeline.getChannel(); if (ch instanceof AbstractNioChannel<?>) { AbstractNioChannel<?> channel = (AbstractNioChannel<?>) ch; ChannelRunnableWrapper wrapper = new ChannelRunnableWrapper(pipeline.getChannel(), task); channel.worker.executeInIoThread(wrapper); return wrapper; } return super.execute(pipeline, task); }
@Override public void execute(Runnable command) { worker.executeInIoThread(command, /* alwaysAsync */ true); } }
public void executeInIoThread(Runnable task) { executeInIoThread(task, false); }
private static boolean isInIoThread(AbstractNioWorker worker) { final Thread[] ioThread = new Thread[]{null}; worker.executeInIoThread(new Runnable() { @Override public void run() { ioThread[0] = currentThread(); } }); boolean aligned = ioThread[0] == currentThread(); assert aligned : format("Current thread %s does not match I/O thread %s", currentThread(), ioThread[0]); return aligned; }
@Override public ChannelFuture execute(ChannelPipeline pipeline, final Runnable task) { Channel ch = pipeline.getChannel(); if (ch instanceof AbstractNioChannel<?>) { AbstractNioChannel<?> channel = (AbstractNioChannel<?>) ch; ChannelRunnableWrapper wrapper = new ChannelRunnableWrapper(pipeline.getChannel(), task); channel.worker.executeInIoThread(wrapper); return wrapper; } return super.execute(pipeline, task); }
ChannelFuture parentFuture = parentMessageEvent.getFuture(); parentFuture.addListener(f -> { childChannel.getWorker().executeInIoThread(() -> { if (f.isSuccess()) { childFuture.setSuccess();