diff options
Diffstat (limited to 'java/src/IceInternal/ThreadPool.java')
-rw-r--r-- | java/src/IceInternal/ThreadPool.java | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/java/src/IceInternal/ThreadPool.java b/java/src/IceInternal/ThreadPool.java index 291f2973e3b..7ac3440f732 100644 --- a/java/src/IceInternal/ThreadPool.java +++ b/java/src/IceInternal/ThreadPool.java @@ -191,7 +191,6 @@ public final class ThreadPool _priority = priority; _workQueue = new ThreadPoolWorkQueue(_instance, this, _selector); - _nextHandler = _handlers.iterator(); if(_instance.traceLevels().threadPool >= 1) @@ -378,14 +377,8 @@ public final class ThreadPool } // - // TODO: MJN: InterruptedException leads to a leak as the - // work queue and selector are not destroyed? - // - - // // Destroy the selector // - _workQueue.close(); _selector.destroy(); } @@ -417,21 +410,25 @@ public final class ThreadPool } else if(select) { - try - { - _selector.select(handlers, _serverIdleTime); - } - catch(Selector.TimeoutException ex) + if(_workQueue.size() == 0) { - synchronized(this) + try + { + _selector.select(handlers, _serverIdleTime); + } + catch(Selector.TimeoutException ex) { - if(!_destroyed && _inUse == 0) + synchronized(this) { - _workQueue.queue(new ShutdownWorkItem()); // Select timed-out. + if(!_destroyed && _inUse == 0) + { + _workQueue.queue(new ShutdownWorkItem()); // Select timed-out. + } + continue; } - continue; } } + _workQueue.update(handlers); } synchronized(this) |