Decreased the number of wakeup() calls even when then constraint level is greater than 0

This commit is contained in:
Trustin Lee 2008-08-30 06:19:45 +00:00
parent 90e35cfc14
commit fd4de999bb

View File

@ -114,7 +114,10 @@ class NioWorker implements Runnable {
executor.execute(new ThreadRenamingRunnable(this, threadName)); executor.execute(new ThreadRenamingRunnable(this, threadName));
} else { } else {
synchronized (selectorGuard) { synchronized (selectorGuard) {
if (wakenUp.compareAndSet(false, true)) {
selector.wakeup(); selector.wakeup();
}
try { try {
channel.socket.register(selector, SelectionKey.OP_READ, channel); channel.socket.register(selector, SelectionKey.OP_READ, channel);
if (future != null) { if (future != null) {
@ -366,7 +369,7 @@ class NioWorker implements Runnable {
boolean changed = false; boolean changed = false;
if (opWrite) { if (opWrite) {
if (!mightNeedWakeup) { if (!mightNeedWakeup) {
interestOps = key.interestOps(); interestOps = channel.getInterestOps();
if ((interestOps & SelectionKey.OP_WRITE) == 0) { if ((interestOps & SelectionKey.OP_WRITE) == 0) {
interestOps |= SelectionKey.OP_WRITE; interestOps |= SelectionKey.OP_WRITE;
key.interestOps(interestOps); key.interestOps(interestOps);
@ -375,7 +378,7 @@ class NioWorker implements Runnable {
} else { } else {
switch (CONSTRAINT_LEVEL) { switch (CONSTRAINT_LEVEL) {
case 0: case 0:
interestOps = key.interestOps(); interestOps = channel.getInterestOps();
if ((interestOps & SelectionKey.OP_WRITE) == 0) { if ((interestOps & SelectionKey.OP_WRITE) == 0) {
interestOps |= SelectionKey.OP_WRITE; interestOps |= SelectionKey.OP_WRITE;
key.interestOps(interestOps); key.interestOps(interestOps);
@ -387,35 +390,18 @@ class NioWorker implements Runnable {
} }
break; break;
case 1: case 1:
interestOps = key.interestOps();
if ((interestOps & SelectionKey.OP_WRITE) == 0) {
if (Thread.currentThread() == worker.thread) {
interestOps |= SelectionKey.OP_WRITE;
key.interestOps(interestOps);
changed = true;
} else {
synchronized (worker.selectorGuard) {
selector.wakeup();
interestOps |= SelectionKey.OP_WRITE;
key.interestOps(interestOps);
changed = true;
}
}
}
break;
case 2: case 2:
if (Thread.currentThread() == worker.thread) { interestOps = channel.getInterestOps();
interestOps = key.interestOps();
if ((interestOps & SelectionKey.OP_WRITE) == 0) { if ((interestOps & SelectionKey.OP_WRITE) == 0) {
if (Thread.currentThread() == worker.thread) {
interestOps |= SelectionKey.OP_WRITE; interestOps |= SelectionKey.OP_WRITE;
key.interestOps(interestOps); key.interestOps(interestOps);
changed = true; changed = true;
}
} else { } else {
synchronized (worker.selectorGuard) { synchronized (worker.selectorGuard) {
if (worker.wakenUp.compareAndSet(false, true)) {
selector.wakeup(); selector.wakeup();
interestOps = key.interestOps(); }
if ((interestOps & SelectionKey.OP_WRITE) == 0) {
interestOps |= SelectionKey.OP_WRITE; interestOps |= SelectionKey.OP_WRITE;
key.interestOps(interestOps); key.interestOps(interestOps);
changed = true; changed = true;
@ -429,7 +415,7 @@ class NioWorker implements Runnable {
} }
} else { } else {
if (!mightNeedWakeup) { if (!mightNeedWakeup) {
interestOps = key.interestOps(); interestOps = channel.getInterestOps();
if ((interestOps & SelectionKey.OP_WRITE) != 0) { if ((interestOps & SelectionKey.OP_WRITE) != 0) {
interestOps &= ~SelectionKey.OP_WRITE; interestOps &= ~SelectionKey.OP_WRITE;
key.interestOps(interestOps); key.interestOps(interestOps);
@ -438,7 +424,7 @@ class NioWorker implements Runnable {
} else { } else {
switch (CONSTRAINT_LEVEL) { switch (CONSTRAINT_LEVEL) {
case 0: case 0:
interestOps = key.interestOps(); interestOps = channel.getInterestOps();
if ((interestOps & SelectionKey.OP_WRITE) != 0) { if ((interestOps & SelectionKey.OP_WRITE) != 0) {
interestOps &= ~SelectionKey.OP_WRITE; interestOps &= ~SelectionKey.OP_WRITE;
key.interestOps(interestOps); key.interestOps(interestOps);
@ -450,35 +436,18 @@ class NioWorker implements Runnable {
} }
break; break;
case 1: case 1:
interestOps = key.interestOps();
if ((interestOps & SelectionKey.OP_WRITE) != 0) {
if (Thread.currentThread() == worker.thread) {
interestOps &= ~SelectionKey.OP_WRITE;
key.interestOps(interestOps);
changed = true;
} else {
synchronized (worker.selectorGuard) {
selector.wakeup();
interestOps &= ~SelectionKey.OP_WRITE;
key.interestOps(interestOps);
changed = true;
}
}
}
break;
case 2: case 2:
if (Thread.currentThread() == worker.thread) { interestOps = channel.getInterestOps();
interestOps = key.interestOps();
if ((interestOps & SelectionKey.OP_WRITE) != 0) { if ((interestOps & SelectionKey.OP_WRITE) != 0) {
if (Thread.currentThread() == worker.thread) {
interestOps &= ~SelectionKey.OP_WRITE; interestOps &= ~SelectionKey.OP_WRITE;
key.interestOps(interestOps); key.interestOps(interestOps);
changed = true; changed = true;
}
} else { } else {
synchronized (worker.selectorGuard) { synchronized (worker.selectorGuard) {
if (worker.wakenUp.compareAndSet(false, true)) {
selector.wakeup(); selector.wakeup();
interestOps = key.interestOps(); }
if ((interestOps & SelectionKey.OP_WRITE) != 0) {
interestOps &= ~SelectionKey.OP_WRITE; interestOps &= ~SelectionKey.OP_WRITE;
key.interestOps(interestOps); key.interestOps(interestOps);
changed = true; changed = true;
@ -556,7 +525,7 @@ class NioWorker implements Runnable {
try { try {
switch (CONSTRAINT_LEVEL) { switch (CONSTRAINT_LEVEL) {
case 0: case 0:
if (key.interestOps() != interestOps) { if (channel.getInterestOps() != interestOps) {
key.interestOps(interestOps); key.interestOps(interestOps);
if (Thread.currentThread() != worker.thread && if (Thread.currentThread() != worker.thread &&
worker.wakenUp.compareAndSet(false, true)) { worker.wakenUp.compareAndSet(false, true)) {
@ -566,29 +535,16 @@ class NioWorker implements Runnable {
} }
break; break;
case 1: case 1:
if (key.interestOps() != interestOps) {
if (Thread.currentThread() == worker.thread) {
key.interestOps(interestOps);
changed = true;
} else {
synchronized (worker.selectorGuard) {
selector.wakeup();
key.interestOps(interestOps);
changed = true;
}
}
}
break;
case 2: case 2:
if (channel.getInterestOps() != interestOps) {
if (Thread.currentThread() == worker.thread) { if (Thread.currentThread() == worker.thread) {
if (key.interestOps() != interestOps) {
key.interestOps(interestOps); key.interestOps(interestOps);
changed = true; changed = true;
}
} else { } else {
synchronized (worker.selectorGuard) { synchronized (worker.selectorGuard) {
if (worker.wakenUp.compareAndSet(false, true)) {
selector.wakeup(); selector.wakeup();
if (key.interestOps() != interestOps) { }
key.interestOps(interestOps); key.interestOps(interestOps);
changed = true; changed = true;
} }