It's actually enough with a simple shutdown lock because we have only one acceptor thread.

This commit is contained in:
Trustin Lee 2008-09-28 15:07:47 +00:00
parent dccc9f8665
commit 8fb2f7c789

View File

@ -75,7 +75,7 @@ class NioWorker implements Runnable {
private volatile Selector selector; private volatile Selector selector;
private final AtomicBoolean wakenUp = new AtomicBoolean(); private final AtomicBoolean wakenUp = new AtomicBoolean();
private final ReadWriteLock selectorGuard = new ReentrantReadWriteLock(); private final ReadWriteLock selectorGuard = new ReentrantReadWriteLock();
private final ReadWriteLock shutdownLock = new ReentrantReadWriteLock(); private final Object shutdownLock = new Object();
//private final FastQueue<Runnable> taskQueue = new FastQueue<Runnable>(); //private final FastQueue<Runnable> taskQueue = new FastQueue<Runnable>();
//private final ConcurrentFastQueue<Runnable> taskQueue = new ConcurrentFastQueue<Runnable>(); //private final ConcurrentFastQueue<Runnable> taskQueue = new ConcurrentFastQueue<Runnable>();
private final FastQueue<Runnable> registerTaskQueue = new FastQueue<Runnable>(); private final FastQueue<Runnable> registerTaskQueue = new FastQueue<Runnable>();
@ -117,11 +117,8 @@ class NioWorker implements Runnable {
executor.execute(new ThreadRenamingRunnable(this, threadName)); executor.execute(new ThreadRenamingRunnable(this, threadName));
} else { } else {
shutdownLock.readLock().lock(); synchronized (shutdownLock) {
try {
registerTaskQueue.offer(registerTask); registerTaskQueue.offer(registerTask);
} finally {
shutdownLock.readLock().unlock();
} }
if (wakenUp.compareAndSet(false, true)) { if (wakenUp.compareAndSet(false, true)) {
selector.wakeup(); selector.wakeup();
@ -163,8 +160,7 @@ class NioWorker implements Runnable {
if (shutdown || if (shutdown ||
executor instanceof ExecutorService && ((ExecutorService) executor).isShutdown()) { executor instanceof ExecutorService && ((ExecutorService) executor).isShutdown()) {
shutdownLock.writeLock().lock(); synchronized (shutdownLock) {
try {
if (registerTaskQueue.isEmpty() && selector.keys().isEmpty()) { if (registerTaskQueue.isEmpty() && selector.keys().isEmpty()) {
try { try {
selector.close(); selector.close();
@ -179,8 +175,6 @@ class NioWorker implements Runnable {
} else { } else {
shutdown = false; shutdown = false;
} }
} finally {
shutdownLock.writeLock().unlock();
} }
} else { } else {
// Give one more second. // Give one more second.