Optimize the handling of fireEventLater if the current thread is the

worker thread. See #187 and #140
This commit is contained in:
Norman Maurer 2012-02-24 22:03:32 +01:00
parent 5fdd2dea12
commit c2bc463d61
4 changed files with 25 additions and 15 deletions

View File

@ -28,13 +28,18 @@ public abstract class AbstractScptChannelSink extends AbstractChannelSink{
Channel ch = e.getChannel();
if (ch instanceof SctpChannelImpl) {
SctpChannelImpl channel = (SctpChannelImpl) ch;
channel.worker.fireEventLater(new Runnable() {
// check if the current thread is a worker thread, and only fire the event later if thats not the case
if (channel.worker.thread != Thread.currentThread()) {
channel.worker.fireEventLater(new Runnable() {
@Override
public void run() {
pipeline.sendUpstream(e);
}
});
@Override
public void run() {
pipeline.sendUpstream(e);
}
});
} else {
pipeline.sendUpstream(e);
}
} else {
throw new UnsupportedOperationException();
}

View File

@ -65,7 +65,7 @@ class SctpWorker implements Worker {
private final Executor executor;
private boolean started;
private volatile Thread thread;
volatile Thread thread;
volatile Selector selector;
private final AtomicBoolean wakenUp = new AtomicBoolean();
private final ReadWriteLock selectorGuard = new ReentrantReadWriteLock();

View File

@ -28,13 +28,18 @@ public abstract class AbstractNioChannelSink extends AbstractChannelSink{
Channel ch = e.getChannel();
if (ch instanceof AbstractNioChannel<?>) {
AbstractNioChannel<?> channel = (AbstractNioChannel<?>) ch;
channel.worker.fireEventLater(new Runnable() {
// check if the current thread is a worker thread if so we can send the event now
if (channel.worker.thread != Thread.currentThread()) {
channel.worker.fireEventLater(new Runnable() {
@Override
public void run() {
pipeline.sendUpstream(e);
}
});
@Override
public void run() {
pipeline.sendUpstream(e);
}
});
} else {
pipeline.sendUpstream(e);
}
} else {
throw new UnsupportedOperationException();
}

View File

@ -30,7 +30,7 @@ public abstract class AbstractOioChannelSink extends AbstractChannelSink{
if (ch instanceof AbstractOioChannel) {
AbstractOioChannel channel = (AbstractOioChannel) ch;
Worker worker = channel.worker;
if (worker != null) {
if (worker != null && channel.workerThread != Thread.currentThread()) {
channel.worker.fireEventLater(new Runnable() {
@Override
@ -39,7 +39,7 @@ public abstract class AbstractOioChannelSink extends AbstractChannelSink{
}
});
} else {
// no worker thread yet so just fire the event now
// no worker thread yet or the current thread is a worker thread so just fire the event now
pipeline.sendUpstream(e);
}