diff options
author | Michi Henning <michi@zeroc.com> | 2005-04-26 04:56:19 +0000 |
---|---|---|
committer | Michi Henning <michi@zeroc.com> | 2005-04-26 04:56:19 +0000 |
commit | 1f9bc3be8ae7d6ded9bae8fd902fef6bff90f651 (patch) | |
tree | 8e4dd38711a13cae633aaed0d779b5e25f0bf593 /java | |
parent | fix for bug 248 (diff) | |
download | ice-1f9bc3be8ae7d6ded9bae8fd902fef6bff90f651.tar.bz2 ice-1f9bc3be8ae7d6ded9bae8fd902fef6bff90f651.tar.xz ice-1f9bc3be8ae7d6ded9bae8fd902fef6bff90f651.zip |
Made finalizers thread-safe.
Diffstat (limited to 'java')
49 files changed, 128 insertions, 93 deletions
diff --git a/java/CHANGES b/java/CHANGES index b7ead8b432e..3a09e38fd69 100644 --- a/java/CHANGES +++ b/java/CHANGES @@ -1,6 +1,9 @@ Changes since version 2.1.0 --------------------------- +- Fixed a race condition that could cause a process to abort + during shutdown. + - Added sequences of fixed-length elements to throughput demo. - Fixed a bug that could cause an assert if connections could not be diff --git a/java/src/Ice/CommunicatorI.java b/java/src/Ice/CommunicatorI.java index b72d3144546..0e027e6844b 100644 --- a/java/src/Ice/CommunicatorI.java +++ b/java/src/Ice/CommunicatorI.java @@ -272,7 +272,7 @@ public final class CommunicatorI extends LocalObjectImpl implements Communicator _instance = new IceInternal.Instance(this, properties); } - protected void + protected synchronized void finalize() throws Throwable { diff --git a/java/src/Ice/ObjectAdapterI.java b/java/src/Ice/ObjectAdapterI.java index 5b644219ab8..7d9e4b4e57b 100644 --- a/java/src/Ice/ObjectAdapterI.java +++ b/java/src/Ice/ObjectAdapterI.java @@ -729,7 +729,7 @@ public final class ObjectAdapterI extends LocalObjectImpl implements ObjectAdapt } } - protected void + protected synchronized void finalize() throws Throwable { diff --git a/java/src/Ice/_ObjectDelM.java b/java/src/Ice/_ObjectDelM.java index 26c44951351..718183e7c79 100644 --- a/java/src/Ice/_ObjectDelM.java +++ b/java/src/Ice/_ObjectDelM.java @@ -237,13 +237,16 @@ public class _ObjectDelM implements _ObjectDel finalize() throws Throwable { - while(__outgoingCache != null) - { - IceInternal.Outgoing next = __outgoingCache.next; - __outgoingCache.destroy(); - __outgoingCache.next = null; - __outgoingCache = next; - } + synchronized(__outgoingMutex) + { + while(__outgoingCache != null) + { + IceInternal.Outgoing next = __outgoingCache.next; + __outgoingCache.destroy(); + __outgoingCache.next = null; + __outgoingCache = next; + } + } } private IceInternal.Outgoing __outgoingCache; diff --git a/java/src/IceInternal/ConnectionMonitor.java b/java/src/IceInternal/ConnectionMonitor.java index 0c36221c2b4..6dac428bf03 100644 --- a/java/src/IceInternal/ConnectionMonitor.java +++ b/java/src/IceInternal/ConnectionMonitor.java @@ -75,7 +75,7 @@ public final class ConnectionMonitor extends Thread start(); } - protected void + protected synchronized void finalize() throws Throwable { diff --git a/java/src/IceInternal/EventHandler.java b/java/src/IceInternal/EventHandler.java index 8f2227ddd7b..66699da36dd 100644 --- a/java/src/IceInternal/EventHandler.java +++ b/java/src/IceInternal/EventHandler.java @@ -58,8 +58,11 @@ public abstract class EventHandler public void destroy() { - _stream.destroy(); - _stream = null; + synchronized(this) + { + _stream.destroy(); + _stream = null; + } } protected diff --git a/java/src/IceInternal/IncomingBase.java b/java/src/IceInternal/IncomingBase.java index 0551a37c388..40a6ca1968e 100644 --- a/java/src/IceInternal/IncomingBase.java +++ b/java/src/IceInternal/IncomingBase.java @@ -62,7 +62,7 @@ public class IncomingBase // penalty! We must make sure that __destroy() is called instead, // to reclaim resources. // - public void + public synchronized void __destroy() { if(_os != null) @@ -103,13 +103,16 @@ public class IncomingBase _compress = compress; - if(_os == null) - { - _os = new BasicStream(instance); - } - else + synchronized(this) { - _os.reset(); + if(_os == null) + { + _os = new BasicStream(instance); + } + else + { + _os.reset(); + } } _connection = connection; diff --git a/java/src/IceInternal/IncomingConnectionFactory.java b/java/src/IceInternal/IncomingConnectionFactory.java index 60911ecf5aa..34e0d2bc487 100644 --- a/java/src/IceInternal/IncomingConnectionFactory.java +++ b/java/src/IceInternal/IncomingConnectionFactory.java @@ -448,11 +448,14 @@ public final class IncomingConnectionFactory extends EventHandler // // Clean up for finalizer. // - _state = StateClosed; - _acceptor = null; - _connections = null; - _threadPerIncomingConnectionFactory = null; - super.destroy(); + synchronized(this) + { + _state = StateClosed; + _acceptor = null; + _connections = null; + _threadPerIncomingConnectionFactory = null; + super.destroy(); + } Ice.SyscallException e = new Ice.SyscallException(); e.initCause(ex); diff --git a/java/src/IceInternal/Instance.java b/java/src/IceInternal/Instance.java index 08075389ec4..fb2e17747ba 100644 --- a/java/src/IceInternal/Instance.java +++ b/java/src/IceInternal/Instance.java @@ -457,7 +457,7 @@ public final class Instance } } - protected void + protected synchronized void finalize() throws Throwable { diff --git a/java/src/IceInternal/ObjectAdapterFactory.java b/java/src/IceInternal/ObjectAdapterFactory.java index 68450385d88..7caa17ef2b7 100644 --- a/java/src/IceInternal/ObjectAdapterFactory.java +++ b/java/src/IceInternal/ObjectAdapterFactory.java @@ -173,7 +173,7 @@ public final class ObjectAdapterFactory _waitForShutdown = false; } - protected void + protected synchronized void finalize() throws Throwable { diff --git a/java/src/IceInternal/OutgoingConnectionFactory.java b/java/src/IceInternal/OutgoingConnectionFactory.java index cddf01ea198..c6e060258db 100644 --- a/java/src/IceInternal/OutgoingConnectionFactory.java +++ b/java/src/IceInternal/OutgoingConnectionFactory.java @@ -538,7 +538,7 @@ public final class OutgoingConnectionFactory _destroyed = false; } - protected void + protected synchronized void finalize() throws Throwable { diff --git a/java/src/IceInternal/TcpAcceptor.java b/java/src/IceInternal/TcpAcceptor.java index 8d1b8eb7b47..654c3fde933 100644 --- a/java/src/IceInternal/TcpAcceptor.java +++ b/java/src/IceInternal/TcpAcceptor.java @@ -26,10 +26,14 @@ class TcpAcceptor implements Acceptor _logger.trace(_traceLevels.networkCat, s); } - java.nio.channels.ServerSocketChannel fd = _fd; + java.nio.channels.ServerSocketChannel fd; + synchronized(this) + { + fd = _fd; + _fd = null; + } if(fd != null) { - _fd = null; try { fd.close(); @@ -130,7 +134,7 @@ class TcpAcceptor implements Acceptor } } - protected void + protected synchronized void finalize() throws Throwable { diff --git a/java/src/IceInternal/TcpTransceiver.java b/java/src/IceInternal/TcpTransceiver.java index 17053a464d9..a7be7d9577e 100644 --- a/java/src/IceInternal/TcpTransceiver.java +++ b/java/src/IceInternal/TcpTransceiver.java @@ -27,19 +27,24 @@ final class TcpTransceiver implements Transceiver _logger.trace(_traceLevels.networkCat, s); } - assert(_fd != null); - try - { - _fd.close(); - _fd = null; - } - catch(java.io.IOException ex) - { - _fd = null; - Ice.SocketException se = new Ice.SocketException(); - se.initCause(ex); - throw se; - } + synchronized(this) + { + assert(_fd != null); + try + { + _fd.close(); + } + catch(java.io.IOException ex) + { + Ice.SocketException se = new Ice.SocketException(); + se.initCause(ex); + throw se; + } + finally + { + _fd = null; + } + } } public void @@ -345,7 +350,7 @@ final class TcpTransceiver implements Transceiver _desc = Network.fdToString(_fd); } - protected void + protected synchronized void finalize() throws Throwable { diff --git a/java/src/IceInternal/ThreadPool.java b/java/src/IceInternal/ThreadPool.java index 7da1cf0c405..67256e507ad 100644 --- a/java/src/IceInternal/ThreadPool.java +++ b/java/src/IceInternal/ThreadPool.java @@ -122,7 +122,7 @@ public final class ThreadPool } } - protected void + protected synchronized void finalize() throws Throwable { @@ -274,7 +274,6 @@ public final class ThreadPool // wouldn't be possible here anyway, because otherwise the // other threads would never terminate.) // - assert(_destroyed); java.util.Iterator i = _threads.iterator(); while(i.hasNext()) { diff --git a/java/src/IceInternal/UdpTransceiver.java b/java/src/IceInternal/UdpTransceiver.java index 7933a34744e..16ae2c707ca 100644 --- a/java/src/IceInternal/UdpTransceiver.java +++ b/java/src/IceInternal/UdpTransceiver.java @@ -18,7 +18,7 @@ final class UdpTransceiver implements Transceiver return _fd; } - public void + public synchronized void close() { if(_traceLevels.network >= 1) @@ -403,7 +403,7 @@ final class UdpTransceiver implements Transceiver } } - protected void + protected synchronized void finalize() throws Throwable { diff --git a/java/src/IceSSL/SslAcceptor.java b/java/src/IceSSL/SslAcceptor.java index 60571e60d08..8d9b984c05c 100644 --- a/java/src/IceSSL/SslAcceptor.java +++ b/java/src/IceSSL/SslAcceptor.java @@ -26,10 +26,14 @@ class SslAcceptor implements IceInternal.Acceptor _logger.trace(_instance.networkTraceCategory(), s); } - javax.net.ssl.SSLServerSocket fd = _fd; - if(fd != null) + javax.net.ssl.SSLServerSocket fd; + synchronized(this) { + fd = _fd; _fd = null; + } + if(fd != null) + { try { fd.close(); diff --git a/java/src/IceSSL/SslConnector.java b/java/src/IceSSL/SslConnector.java index 67a0a3a737c..1808b7b045a 100644 --- a/java/src/IceSSL/SslConnector.java +++ b/java/src/IceSSL/SslConnector.java @@ -19,7 +19,7 @@ final class SslConnector implements IceInternal.Connector _addr = addr; } - protected void + protected synchronized void finalize() throws Throwable { diff --git a/java/src/IceSSL/SslTransceiver.java b/java/src/IceSSL/SslTransceiver.java index 080ceb5b1e4..2ab87607dbd 100644 --- a/java/src/IceSSL/SslTransceiver.java +++ b/java/src/IceSSL/SslTransceiver.java @@ -26,18 +26,23 @@ final class SslTransceiver implements IceInternal.Transceiver _logger.trace(_instance.networkTraceCategory(), s); } - assert(_fd != null); - try - { - _fd.close(); - _fd = null; - } - catch(java.io.IOException ex) + synchronized(this) { - _fd = null; - Ice.SocketException se = new Ice.SocketException(); - se.initCause(ex); - throw se; + assert(_fd != null); + try + { + _fd.close(); + } + catch(java.io.IOException ex) + { + Ice.SocketException se = new Ice.SocketException(); + se.initCause(ex); + throw se; + } + finally + { + _fd = null; + } } } @@ -331,7 +336,7 @@ final class SslTransceiver implements IceInternal.Transceiver _shutdown = false; } - protected void + protected synchronized void finalize() throws Throwable { diff --git a/java/src/IceUtil/Version.java b/java/src/IceUtil/Version.java index 6ca3596492b..e77bffcbc56 100644 --- a/java/src/IceUtil/Version.java +++ b/java/src/IceUtil/Version.java @@ -14,6 +14,6 @@ public final class Version // // The Ice version. // - public final static String ICE_STRING_VERSION = "2.1.0"; // "A.B.C", with A=major, B=minor, C=patch - public final static int ICE_INT_VERSION = 20100; // AABBCC, with AA=major, BB=minor, CC=patch + public final static String ICE_STRING_VERSION = "2.1.1"; // "A.B.C", with A=major, B=minor, C=patch + public final static int ICE_INT_VERSION = 20101; // AABBCC, with AA=major, BB=minor, CC=patch } diff --git a/java/test/Freeze/evictor/Client.java b/java/test/Freeze/evictor/Client.java index 0b8a76ef5b3..2b4a8fd391a 100644 --- a/java/test/Freeze/evictor/Client.java +++ b/java/test/Freeze/evictor/Client.java @@ -834,7 +834,7 @@ public class Client } } - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/Freeze/evictor/Server.java b/java/test/Freeze/evictor/Server.java index 13bd4a52b72..47decb48028 100644 --- a/java/test/Freeze/evictor/Server.java +++ b/java/test/Freeze/evictor/Server.java @@ -100,6 +100,7 @@ public class Server } } + System.gc(); System.exit(status); } } diff --git a/java/test/Glacier2/router/Client.java b/java/test/Glacier2/router/Client.java index 73c2218a135..682484d53ee 100644 --- a/java/test/Glacier2/router/Client.java +++ b/java/test/Glacier2/router/Client.java @@ -24,7 +24,7 @@ public class Client CallbackClient app = new CallbackClient(); int status = app.main("Client", argsH.value); - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/Glacier2/router/Server.java b/java/test/Glacier2/router/Server.java index 290409c07d0..9a40cc706a8 100644 --- a/java/test/Glacier2/router/Server.java +++ b/java/test/Glacier2/router/Server.java @@ -14,7 +14,7 @@ public class Server { CallbackServer app = new CallbackServer(); int status = app.main("Server", args); - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/Ice/adapterDeactivation/ServantLocatorI.java b/java/test/Ice/adapterDeactivation/ServantLocatorI.java index 0244c3403a4..c266800efe6 100644 --- a/java/test/Ice/adapterDeactivation/ServantLocatorI.java +++ b/java/test/Ice/adapterDeactivation/ServantLocatorI.java @@ -17,7 +17,7 @@ public final class ServantLocatorI extends Ice.LocalObjectImpl implements Ice.Se _deactivated = false; } - protected void + protected synchronized void finalize() throws Throwable { @@ -55,7 +55,7 @@ public final class ServantLocatorI extends Ice.LocalObjectImpl implements Ice.Se test(co.message().equals("blahblah")); } - public void + public synchronized void deactivate(String category) { test(!_deactivated); diff --git a/java/test/Ice/custom/Client.java b/java/test/Ice/custom/Client.java index afc658b81d3..c82456710aa 100644 --- a/java/test/Ice/custom/Client.java +++ b/java/test/Ice/custom/Client.java @@ -49,7 +49,7 @@ public class Client } } - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/Ice/custom/Server.java b/java/test/Ice/custom/Server.java index 46ce9dcbeb3..1e066170427 100644 --- a/java/test/Ice/custom/Server.java +++ b/java/test/Ice/custom/Server.java @@ -53,7 +53,7 @@ public class Server } } - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/Ice/exceptions/Client.java b/java/test/Ice/exceptions/Client.java index 3cb96863dc6..06c5df1c1ce 100644 --- a/java/test/Ice/exceptions/Client.java +++ b/java/test/Ice/exceptions/Client.java @@ -49,7 +49,7 @@ public class Client } } - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/Ice/facets/Client.java b/java/test/Ice/facets/Client.java index a657d308718..853f23195fe 100644 --- a/java/test/Ice/facets/Client.java +++ b/java/test/Ice/facets/Client.java @@ -49,7 +49,7 @@ public class Client } } - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/Ice/facets/Server.java b/java/test/Ice/facets/Server.java index 94dbf1d7555..b0463d48fbb 100644 --- a/java/test/Ice/facets/Server.java +++ b/java/test/Ice/facets/Server.java @@ -58,7 +58,7 @@ public class Server } } - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/Ice/faultTolerance/Client.java b/java/test/Ice/faultTolerance/Client.java index 0ab59c89654..4185cb4acdb 100644 --- a/java/test/Ice/faultTolerance/Client.java +++ b/java/test/Ice/faultTolerance/Client.java @@ -110,7 +110,7 @@ public class Client } } - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/Ice/inheritance/Client.java b/java/test/Ice/inheritance/Client.java index eda8a2c620f..916895de2e6 100644 --- a/java/test/Ice/inheritance/Client.java +++ b/java/test/Ice/inheritance/Client.java @@ -49,7 +49,7 @@ public class Client } } - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/Ice/inheritance/Server.java b/java/test/Ice/inheritance/Server.java index cc91207f7f5..22ed28eeb73 100644 --- a/java/test/Ice/inheritance/Server.java +++ b/java/test/Ice/inheritance/Server.java @@ -51,7 +51,7 @@ public class Server } } - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/Ice/location/Client.java b/java/test/Ice/location/Client.java index 12bf01002f0..c812365ead7 100644 --- a/java/test/Ice/location/Client.java +++ b/java/test/Ice/location/Client.java @@ -48,7 +48,7 @@ public class Client } } - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/Ice/objects/Client.java b/java/test/Ice/objects/Client.java index 2ef6ce07276..d0f5946b2a9 100644 --- a/java/test/Ice/objects/Client.java +++ b/java/test/Ice/objects/Client.java @@ -82,7 +82,7 @@ public class Client } } - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/Ice/objects/Server.java b/java/test/Ice/objects/Server.java index cc91207f7f5..22ed28eeb73 100644 --- a/java/test/Ice/objects/Server.java +++ b/java/test/Ice/objects/Server.java @@ -51,7 +51,7 @@ public class Server } } - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/Ice/operations/Client.java b/java/test/Ice/operations/Client.java index 4b556028eb7..3edf4d4c3fd 100644 --- a/java/test/Ice/operations/Client.java +++ b/java/test/Ice/operations/Client.java @@ -76,6 +76,7 @@ public class Client } } + System.gc(); System.exit(status); } } diff --git a/java/test/Ice/operations/Server.java b/java/test/Ice/operations/Server.java index beeb7b1a292..7c779ab14e8 100644 --- a/java/test/Ice/operations/Server.java +++ b/java/test/Ice/operations/Server.java @@ -62,6 +62,7 @@ public class Server } } + System.gc(); System.exit(status); } } diff --git a/java/test/Ice/operationsAMD/Server.java b/java/test/Ice/operationsAMD/Server.java index 52656926a3a..64ea330e44b 100644 --- a/java/test/Ice/operationsAMD/Server.java +++ b/java/test/Ice/operationsAMD/Server.java @@ -62,7 +62,7 @@ public class Server } } - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/Ice/package/Client.java b/java/test/Ice/package/Client.java index 735dbeda12a..bc9f39bdd00 100644 --- a/java/test/Ice/package/Client.java +++ b/java/test/Ice/package/Client.java @@ -47,7 +47,7 @@ public class Client } } - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/Ice/package/Server.java b/java/test/Ice/package/Server.java index e5382fac7cf..7084884fabd 100644 --- a/java/test/Ice/package/Server.java +++ b/java/test/Ice/package/Server.java @@ -51,7 +51,7 @@ public class Server } } - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/Ice/slicing/exceptions/csrc/Client.java b/java/test/Ice/slicing/exceptions/csrc/Client.java index 1791c9852b5..e74fd1cfad9 100644 --- a/java/test/Ice/slicing/exceptions/csrc/Client.java +++ b/java/test/Ice/slicing/exceptions/csrc/Client.java @@ -49,7 +49,7 @@ public class Client } } - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/Ice/slicing/exceptions/ssrc/Server.java b/java/test/Ice/slicing/exceptions/ssrc/Server.java index 48368f782dc..4eb9cdc28ae 100644 --- a/java/test/Ice/slicing/exceptions/ssrc/Server.java +++ b/java/test/Ice/slicing/exceptions/ssrc/Server.java @@ -53,7 +53,7 @@ public class Server } } - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/Ice/slicing/exceptionsAMD/Server.java b/java/test/Ice/slicing/exceptionsAMD/Server.java index 48368f782dc..4eb9cdc28ae 100644 --- a/java/test/Ice/slicing/exceptionsAMD/Server.java +++ b/java/test/Ice/slicing/exceptionsAMD/Server.java @@ -53,7 +53,7 @@ public class Server } } - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/Ice/slicing/objects/csrc/Client.java b/java/test/Ice/slicing/objects/csrc/Client.java index 1791c9852b5..e74fd1cfad9 100644 --- a/java/test/Ice/slicing/objects/csrc/Client.java +++ b/java/test/Ice/slicing/objects/csrc/Client.java @@ -49,7 +49,7 @@ public class Client } } - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/Ice/slicing/objects/ssrc/Server.java b/java/test/Ice/slicing/objects/ssrc/Server.java index 48368f782dc..4eb9cdc28ae 100644 --- a/java/test/Ice/slicing/objects/ssrc/Server.java +++ b/java/test/Ice/slicing/objects/ssrc/Server.java @@ -53,7 +53,7 @@ public class Server } } - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/Ice/slicing/objectsAMD/Server.java b/java/test/Ice/slicing/objectsAMD/Server.java index 48368f782dc..4eb9cdc28ae 100644 --- a/java/test/Ice/slicing/objectsAMD/Server.java +++ b/java/test/Ice/slicing/objectsAMD/Server.java @@ -53,7 +53,7 @@ public class Server } } - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/Ice/stream/Client.java b/java/test/Ice/stream/Client.java index a0d2e7f0f1a..b6c3cd457e2 100644 --- a/java/test/Ice/stream/Client.java +++ b/java/test/Ice/stream/Client.java @@ -477,7 +477,7 @@ public class Client } } - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/IcePack/deployer/Client.java b/java/test/IcePack/deployer/Client.java index 99dc591e5f8..da8be540bc3 100644 --- a/java/test/IcePack/deployer/Client.java +++ b/java/test/IcePack/deployer/Client.java @@ -64,7 +64,7 @@ public class Client } } - System.gc(); + System.gc(); System.exit(status); } } diff --git a/java/test/IcePack/simple/Client.java b/java/test/IcePack/simple/Client.java index 275e3842966..71bab6fdb99 100644 --- a/java/test/IcePack/simple/Client.java +++ b/java/test/IcePack/simple/Client.java @@ -73,7 +73,7 @@ public class Client } } - System.gc(); + System.gc(); System.exit(status); } } |