diff options
-rw-r--r-- | java/src/IceInternal/EventHandler.java | 9 | ||||
-rw-r--r-- | java/src/IceInternal/IncomingConnectionFactory.java | 24 |
2 files changed, 24 insertions, 9 deletions
diff --git a/java/src/IceInternal/EventHandler.java b/java/src/IceInternal/EventHandler.java index ffe3bd7d3ab..43389373380 100644 --- a/java/src/IceInternal/EventHandler.java +++ b/java/src/IceInternal/EventHandler.java @@ -55,6 +55,13 @@ public abstract class EventHandler return _instance; } + public void + destroy() + { + _stream.destroy(); + _stream = null; + } + protected EventHandler(Instance instance) { @@ -66,7 +73,7 @@ public abstract class EventHandler finalize() throws Throwable { - _stream.destroy(); + assert(_stream == null); } protected Instance _instance; diff --git a/java/src/IceInternal/IncomingConnectionFactory.java b/java/src/IceInternal/IncomingConnectionFactory.java index 2b0b88711e0..117de308cbc 100644 --- a/java/src/IceInternal/IncomingConnectionFactory.java +++ b/java/src/IceInternal/IncomingConnectionFactory.java @@ -99,8 +99,12 @@ public final class IncomingConnectionFactory extends EventHandler // We want to wait until all connections are finished outside the // thread synchronization. // + // For consistency with C#, we set _connections to null rather than to a + // new empty list so that our finalizer does not try to invoke any + // methods on member objects. + // connections = _connections; - _connections = new java.util.LinkedList(); + _connections = null; } if(threadPerIncomingConnectionFactory != null) @@ -124,6 +128,16 @@ public final class IncomingConnectionFactory extends EventHandler Ice.ConnectionI connection = (Ice.ConnectionI)p.next(); connection.waitUntilFinished(); } + + // + // At this point we know that this factory is no longer used, so it is + // safe to invoke destroy() on the EventHandler base class to reclaim + // resources. + // + // We call this here instead of in the finalizer because a C# finalizer + // cannot invoke methods on other types of objects. + // + super.destroy(); } public Endpoint @@ -445,15 +459,9 @@ public final class IncomingConnectionFactory extends EventHandler { assert(_state == StateClosed); assert(_acceptor == null); - assert(_connections.size() == 0); + assert(_connections == null); assert(_threadPerIncomingConnectionFactory == null); - // - // Destroy the EventHandler's stream, so that its buffer - // can be reclaimed. - // - super._stream.destroy(); - super.finalize(); } |