diff options
author | Benoit Foucher <benoit@zeroc.com> | 2014-10-15 08:20:15 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2014-10-15 08:20:15 +0200 |
commit | 4c6a4a6e77eeb513e2031912698a1fa839d9065a (patch) | |
tree | fdfad1d1dceb1fcc614da334b7058efc99925703 /java/src | |
parent | ICE-5739 missing AMD test in c++ optional (diff) | |
download | ice-4c6a4a6e77eeb513e2031912698a1fa839d9065a.tar.bz2 ice-4c6a4a6e77eeb513e2031912698a1fa839d9065a.tar.xz ice-4c6a4a6e77eeb513e2031912698a1fa839d9065a.zip |
Fixed ICE-5454: close acceptor on adapter deactivation
Diffstat (limited to 'java/src')
-rw-r--r-- | java/src/Ice/ConnectionI.java | 26 | ||||
-rw-r--r-- | java/src/IceInternal/EventHandler.java | 2 | ||||
-rw-r--r-- | java/src/IceInternal/IncomingConnectionFactory.java | 24 | ||||
-rw-r--r-- | java/src/IceInternal/Selector.java | 6 | ||||
-rw-r--r-- | java/src/IceInternal/ThreadPool.java | 15 | ||||
-rw-r--r-- | java/src/IceInternal/ThreadPoolWorkQueue.java | 2 |
6 files changed, 51 insertions, 24 deletions
diff --git a/java/src/Ice/ConnectionI.java b/java/src/Ice/ConnectionI.java index 9ee6ac10121..3ed5e3eed93 100644 --- a/java/src/Ice/ConnectionI.java +++ b/java/src/Ice/ConnectionI.java @@ -1386,7 +1386,7 @@ public final class ConnectionI extends IceInternal.EventHandler } @Override - public void finished(IceInternal.ThreadPoolCurrent current) + public void finished(IceInternal.ThreadPoolCurrent current, final boolean close) { synchronized(this) { @@ -1402,7 +1402,7 @@ public final class ConnectionI extends IceInternal.EventHandler // if(_startCallback == null && _sendStreams.isEmpty() && _asyncRequests.isEmpty() && _callback == null) { - finish(); + finish(close); return; } @@ -1410,7 +1410,7 @@ public final class ConnectionI extends IceInternal.EventHandler if(!_dispatcher) // Optimization, call finish() directly if there's no // dispatcher. { - finish(); + finish(close); } else { @@ -1419,13 +1419,13 @@ public final class ConnectionI extends IceInternal.EventHandler @Override public void run() { - finish(); + finish(close); } }); } } - public void finish() + public void finish(boolean close) { if(!_initialized) { @@ -1454,6 +1454,11 @@ public final class ConnectionI extends IceInternal.EventHandler } } + if(close) + { + _transceiver.close(); + } + if(_startCallback != null) { _startCallback.connectionStartFailed(this, _exception); @@ -1874,14 +1879,21 @@ public final class ConnectionI extends IceInternal.EventHandler { return; } - _threadPool.finish(this); + + // + // Don't need to close now for connections so only close the transceiver + // if the selector request it. + // + if(_threadPool.finish(this, false)) + { + _transceiver.close(); + } break; } case StateFinished: { assert (_state == StateClosed); - _transceiver.close(); _communicator = null; break; } diff --git a/java/src/IceInternal/EventHandler.java b/java/src/IceInternal/EventHandler.java index 7fc70ba578d..3d5ceabdc8e 100644 --- a/java/src/IceInternal/EventHandler.java +++ b/java/src/IceInternal/EventHandler.java @@ -19,7 +19,7 @@ public abstract class EventHandler // // Called when the event handler is unregistered. // - abstract public void finished(ThreadPoolCurrent current); + abstract public void finished(ThreadPoolCurrent current, boolean close); // // Get a textual representation of the event handler. diff --git a/java/src/IceInternal/IncomingConnectionFactory.java b/java/src/IceInternal/IncomingConnectionFactory.java index 31306a14ca6..4e187728281 100644 --- a/java/src/IceInternal/IncomingConnectionFactory.java +++ b/java/src/IceInternal/IncomingConnectionFactory.java @@ -298,10 +298,17 @@ public final class IncomingConnectionFactory extends EventHandler implements Ice @Override public synchronized void - finished(ThreadPoolCurrent current) + finished(ThreadPoolCurrent current, boolean close) { assert(_state == StateClosed); setState(StateFinished); + + assert(_acceptor != null); + + if(close) + { + closeAcceptor(true); + } } @Override @@ -563,7 +570,16 @@ public final class IncomingConnectionFactory extends EventHandler implements Ice { if(_acceptor != null) { - ((Ice.ObjectAdapterI)_adapter).getThreadPool().finish(this); + // + // If possible, close the acceptor now to prevent new connections from + // being accepted while we are deactivating. This is especially useful + // if there are no more threads in the thread pool available to dispatch + // the finish() call. + // + if(((Ice.ObjectAdapterI)_adapter).getThreadPool().finish(this, true)) + { + closeAcceptor(true); + } } else { @@ -580,10 +596,6 @@ public final class IncomingConnectionFactory extends EventHandler implements Ice case StateFinished: { assert(_state == StateClosed); - if(_acceptor != null) - { - closeAcceptor(true); - } break; } } diff --git a/java/src/IceInternal/Selector.java b/java/src/IceInternal/Selector.java index ffccf323d93..03e683420ba 100644 --- a/java/src/IceInternal/Selector.java +++ b/java/src/IceInternal/Selector.java @@ -95,7 +95,7 @@ public final class Selector } } - void finish(EventHandler handler) + boolean finish(EventHandler handler, boolean closeNow) { if(handler._registered != 0) { @@ -105,10 +105,10 @@ public final class Selector handler._key = null; } - _changes.remove(handler); - update(handler, handler._registered, SocketOperation.None); + _changes.remove(handler); } + return closeNow; } void startSelect() diff --git a/java/src/IceInternal/ThreadPool.java b/java/src/IceInternal/ThreadPool.java index 8b3453980fc..c21305d2395 100644 --- a/java/src/IceInternal/ThreadPool.java +++ b/java/src/IceInternal/ThreadPool.java @@ -30,18 +30,20 @@ public final class ThreadPool static final class FinishedWorkItem implements ThreadPoolWorkItem { public - FinishedWorkItem(EventHandler handler) + FinishedWorkItem(EventHandler handler, boolean close) { _handler = handler; + _close = close; } @Override public void execute(ThreadPoolCurrent current) { - _handler.finished(current); + _handler.finished(current, _close); } private final EventHandler _handler; + private final boolean _close; } static final class JoinThreadWorkItem implements ThreadPoolWorkItem @@ -324,12 +326,13 @@ public final class ThreadPool update(handler, op, SocketOperation.None); } - public synchronized void - finish(EventHandler handler) + public synchronized boolean + finish(EventHandler handler, boolean closeNow) { assert(!_destroyed); - _selector.finish(handler); - _workQueue.queue(new FinishedWorkItem(handler)); + closeNow = _selector.finish(handler, closeNow); + _workQueue.queue(new FinishedWorkItem(handler, !closeNow)); + return closeNow; } public void diff --git a/java/src/IceInternal/ThreadPoolWorkQueue.java b/java/src/IceInternal/ThreadPoolWorkQueue.java index 2915a388123..30a013f6dc4 100644 --- a/java/src/IceInternal/ThreadPoolWorkQueue.java +++ b/java/src/IceInternal/ThreadPoolWorkQueue.java @@ -86,7 +86,7 @@ final class ThreadPoolWorkQueue extends EventHandler } @Override - public void finished(ThreadPoolCurrent current) + public void finished(ThreadPoolCurrent current, boolean close) { assert(false); } |