summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2017-06-13 14:39:41 +0200
committerBenoit Foucher <benoit@zeroc.com>2017-06-13 14:39:41 +0200
commitc43d26cb98eb2ab48910f96600b9f402a15af499 (patch)
treefde5db315a9d2da61235938f70c0be38cadc0bf1 /java/src
parentOnly install zeroc.ice.v140 when ICE_BIN_DIST == cpp (diff)
downloadice-c43d26cb98eb2ab48910f96600b9f402a15af499.tar.bz2
ice-c43d26cb98eb2ab48910f96600b9f402a15af499.tar.xz
ice-c43d26cb98eb2ab48910f96600b9f402a15af499.zip
Another fix for ICE-8015 - clearing connections from ACM monitor
Diffstat (limited to 'java/src')
-rw-r--r--java/src/Ice/src/main/java/com/zeroc/IceInternal/FactoryACMMonitor.java30
1 files changed, 30 insertions, 0 deletions
diff --git a/java/src/Ice/src/main/java/com/zeroc/IceInternal/FactoryACMMonitor.java b/java/src/Ice/src/main/java/com/zeroc/IceInternal/FactoryACMMonitor.java
index ba3a1b3c884..46bf10b1733 100644
--- a/java/src/Ice/src/main/java/com/zeroc/IceInternal/FactoryACMMonitor.java
+++ b/java/src/Ice/src/main/java/com/zeroc/IceInternal/FactoryACMMonitor.java
@@ -57,8 +57,36 @@ class FactoryACMMonitor implements ACMMonitor
{
return;
}
+
+ if(!_connections.isEmpty())
+ {
+ //
+ // Cancel the scheduled timer task and schedule it again now to clear the
+ // connection set from the timer thread.
+ //
+ assert(_future != null);
+ _future.cancel(false);
+ _future = null;
+
+ _instance.timer().schedule(() -> { monitorConnections(); }, 0, java.util.concurrent.TimeUnit.MILLISECONDS);
+ }
+
_instance = null;
_changes.clear();
+
+ //
+ // Wait for the connection set to be cleared by the timer thread.
+ //
+ while(!_connections.isEmpty())
+ {
+ try
+ {
+ wait();
+ }
+ catch(InterruptedException ex)
+ {
+ }
+ }
}
@Override
@@ -72,6 +100,7 @@ class FactoryACMMonitor implements ACMMonitor
synchronized(this)
{
+ assert(_instance != null);
if(_connections.isEmpty())
{
_connections.add(connection);
@@ -165,6 +194,7 @@ class FactoryACMMonitor implements ACMMonitor
if(_instance == null)
{
_connections.clear();
+ notify();
return;
}