diff options
Diffstat (limited to 'java')
5 files changed, 43 insertions, 14 deletions
diff --git a/java/src/Ice/src/main/java/com/zeroc/Ice/CommunicatorI.java b/java/src/Ice/src/main/java/com/zeroc/Ice/CommunicatorI.java index 3ee8b9f7054..1f9041840b0 100644 --- a/java/src/Ice/src/main/java/com/zeroc/Ice/CommunicatorI.java +++ b/java/src/Ice/src/main/java/com/zeroc/Ice/CommunicatorI.java @@ -13,9 +13,16 @@ public final class CommunicatorI implements Communicator { @Override public void + close() + { + _instance.destroy(false); // Don't allow destroy to be interrupted if called from try with statement. + } + + @Override + public void destroy() { - _instance.destroy(); + _instance.destroy(true); // Destroy is interruptible when call explicitly. } @Override @@ -315,7 +322,7 @@ public final class CommunicatorI implements Communicator } catch(RuntimeException ex) { - _instance.destroy(); + _instance.destroy(false); throw ex; } } diff --git a/java/src/Ice/src/main/java/com/zeroc/Ice/Util.java b/java/src/Ice/src/main/java/com/zeroc/Ice/Util.java index ff50bab15e7..b4e008352da 100644 --- a/java/src/Ice/src/main/java/com/zeroc/Ice/Util.java +++ b/java/src/Ice/src/main/java/com/zeroc/Ice/Util.java @@ -84,8 +84,21 @@ public final class Util /** * Encapsulates the results of a call to initialize(). **/ - public static class InitializeResult + public static class InitializeResult implements java.lang.AutoCloseable { + @Override + public void close() + { + try + { + communicator.close(); + } + catch(java.lang.Exception ex) + { + assert(false); + } + } + /** The new communicator. */ public Communicator communicator; diff --git a/java/src/Ice/src/main/java/com/zeroc/IceInternal/Instance.java b/java/src/Ice/src/main/java/com/zeroc/IceInternal/Instance.java index 5bf70b1d2f6..305fee3f5d3 100644 --- a/java/src/Ice/src/main/java/com/zeroc/IceInternal/Instance.java +++ b/java/src/Ice/src/main/java/com/zeroc/IceInternal/Instance.java @@ -1171,7 +1171,7 @@ public final class Instance implements com.zeroc.Ice.ClassResolver } catch(com.zeroc.Ice.LocalException ex) { - destroy(); + destroy(false); throw ex; } } @@ -1401,9 +1401,9 @@ public final class Instance implements com.zeroc.Ice.ClassResolver // @SuppressWarnings("deprecation") public void - destroy() + destroy(boolean interruptible) { - if(Thread.interrupted()) + if(interruptible && Thread.interrupted()) { throw new com.zeroc.Ice.OperationInterruptedException(); } @@ -1423,7 +1423,10 @@ public final class Instance implements com.zeroc.Ice.ClassResolver } catch(InterruptedException ex) { - throw new com.zeroc.Ice.OperationInterruptedException(); + if(interruptible) + { + throw new com.zeroc.Ice.OperationInterruptedException(); + } } } @@ -1532,7 +1535,10 @@ public final class Instance implements com.zeroc.Ice.ClassResolver } catch(InterruptedException ex) { - throw new com.zeroc.Ice.OperationInterruptedException(); + if(interruptible) + { + throw new com.zeroc.Ice.OperationInterruptedException(); + } } // @@ -1624,6 +1630,7 @@ public final class Instance implements com.zeroc.Ice.ClassResolver { if(_state == StateDestroyInProgress) { + assert(interruptible); _state = StateActive; notifyAll(); } diff --git a/java/test/src/main/java/test/Ice/info/AllTests.java b/java/test/src/main/java/test/Ice/info/AllTests.java index 9123be0a685..d22aaf55e5b 100644 --- a/java/test/src/main/java/test/Ice/info/AllTests.java +++ b/java/test/src/main/java/test/Ice/info/AllTests.java @@ -210,6 +210,12 @@ public class AllTests test(info.rcvSize >= 1024); test(info.sndSize >= 2048); + // + // Make sure the local slice class is cloneable + // + java.lang.Cloneable cloneable = info; + TCPConnectionInfo info2 = (TCPConnectionInfo)info.clone(); + java.util.Map<String, String> ctx = testIntf.getConnectionInfoAsContext(); test(ctx.get("incoming").equals("true")); test(ctx.get("adapterName").equals("TestAdapter")); diff --git a/java/test/src/main/java/test/Util/Application.java b/java/test/src/main/java/test/Util/Application.java index 73f49b04ff9..50c0badd0b8 100644 --- a/java/test/src/main/java/test/Util/Application.java +++ b/java/test/src/main/java/test/Util/Application.java @@ -94,9 +94,8 @@ public abstract class Application int status = 0; - try + try(Util.InitializeResult ir = Util.initialize(cpr.args, initData)) { - Util.InitializeResult ir = Util.initialize(cpr.args, initData); _communicator = ir.communicator; if(_communicatorListener != null) { @@ -134,11 +133,8 @@ public abstract class Application err.printStackTrace(writer); status = 1; } - writer.flush(); - - if(_communicator != null) + finally { - _communicator.destroy(); _communicator = null; } writer.flush(); |