summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2014-10-15 08:20:15 +0200
committerBenoit Foucher <benoit@zeroc.com>2014-10-15 08:20:15 +0200
commit4c6a4a6e77eeb513e2031912698a1fa839d9065a (patch)
treefdfad1d1dceb1fcc614da334b7058efc99925703 /java/src
parentICE-5739 missing AMD test in c++ optional (diff)
downloadice-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.java26
-rw-r--r--java/src/IceInternal/EventHandler.java2
-rw-r--r--java/src/IceInternal/IncomingConnectionFactory.java24
-rw-r--r--java/src/IceInternal/Selector.java6
-rw-r--r--java/src/IceInternal/ThreadPool.java15
-rw-r--r--java/src/IceInternal/ThreadPoolWorkQueue.java2
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);
}