summaryrefslogtreecommitdiff
path: root/java/src/IceInternal/ThreadPool.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/src/IceInternal/ThreadPool.java')
-rw-r--r--java/src/IceInternal/ThreadPool.java29
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)