diff options
author | Michi Henning <michi@zeroc.com> | 2003-09-04 02:11:46 +0000 |
---|---|---|
committer | Michi Henning <michi@zeroc.com> | 2003-09-04 02:11:46 +0000 |
commit | 5ecbdf0ebe5efd151129d4422b30b7aefe11f9db (patch) | |
tree | fca4840b748039de1d06e78170bb3c6ca23f6933 /java/src | |
parent | Fixed IcePack test cleaning (diff) | |
download | ice-5ecbdf0ebe5efd151129d4422b30b7aefe11f9db.tar.bz2 ice-5ecbdf0ebe5efd151129d4422b30b7aefe11f9db.tar.xz ice-5ecbdf0ebe5efd151129d4422b30b7aefe11f9db.zip |
Fixed race condition in flushBatchRequests(): connections that are not yet
validated are now ignored when flushing.
Diffstat (limited to 'java/src')
-rw-r--r-- | java/src/IceInternal/Connection.java | 21 | ||||
-rw-r--r-- | java/src/IceInternal/Instance.java | 15 | ||||
-rw-r--r-- | java/src/IceInternal/ObjectAdapterFactory.java | 21 | ||||
-rw-r--r-- | java/src/IceInternal/OutgoingConnectionFactory.java | 6 |
4 files changed, 40 insertions, 23 deletions
diff --git a/java/src/IceInternal/Connection.java b/java/src/IceInternal/Connection.java index 6067cd2ec85..80c6f6bd784 100644 --- a/java/src/IceInternal/Connection.java +++ b/java/src/IceInternal/Connection.java @@ -331,6 +331,12 @@ public final class Connection extends EventHandler setState(StateHolding); } + public synchronized boolean + isValidated() + { + return _state > StateNotValidated; + } + public synchronized void incProxyCount() { @@ -379,7 +385,8 @@ public final class Connection extends EventHandler { throw _exception; } - assert(_state > StateNotValidated && _state < StateClosing); + assert(_state > StateNotValidated); + assert(_state < StateClosing); int requestId = 0; @@ -438,7 +445,8 @@ public final class Connection extends EventHandler { throw _exception; } - assert(_state > StateNotValidated && _state < StateClosing); + assert(_state > StateNotValidated); + assert(_state < StateClosing); int requestId = 0; @@ -517,7 +525,8 @@ public final class Connection extends EventHandler { throw _exception; } - assert(_state > StateNotValidated && _state < StateClosing); + assert(_state > StateNotValidated); + assert(_state < StateClosing); if(_batchStream.isEmpty()) { @@ -548,7 +557,8 @@ public final class Connection extends EventHandler { throw _exception; } - assert(_state > StateNotValidated && _state < StateClosing); + assert(_state > StateNotValidated); + assert(_state < StateClosing); _batchStream.swap(os); // Get the batch stream back. ++_batchRequestNum; // Increment the number of requests in the batch. @@ -592,7 +602,8 @@ public final class Connection extends EventHandler { throw _exception; } - assert(_state > StateNotValidated && _state < StateClosing); + assert(_state > StateNotValidated); + assert(_state < StateClosing); if(!_batchStream.isEmpty()) { diff --git a/java/src/IceInternal/Instance.java b/java/src/IceInternal/Instance.java index 99307251ed1..4344399d960 100644 --- a/java/src/IceInternal/Instance.java +++ b/java/src/IceInternal/Instance.java @@ -261,18 +261,15 @@ public class Instance public void flushBatchRequests() { - OutgoingConnectionFactory f; - Ice.ObjectAdapterI adapters[]; + OutgoingConnectionFactory connectionFactory; + ObjectAdapterFactory adapterFactory; synchronized(this) { - f = _outgoingConnectionFactory; - adapters = _objectAdapterFactory.adapters(); - } - f.flushBatchRequests(); - for(int i = 0; i < adapters.length; i++) - { - adapters[i].flushBatchRequests(); + connectionFactory = _outgoingConnectionFactory; + adapterFactory = _objectAdapterFactory; } + connectionFactory.flushBatchRequests(); + adapterFactory.flushBatchRequests(); } public BufferManager diff --git a/java/src/IceInternal/ObjectAdapterFactory.java b/java/src/IceInternal/ObjectAdapterFactory.java index 2f139d16740..edab241f2cc 100644 --- a/java/src/IceInternal/ObjectAdapterFactory.java +++ b/java/src/IceInternal/ObjectAdapterFactory.java @@ -149,18 +149,23 @@ public final class ObjectAdapterFactory return null; } - public synchronized Ice.ObjectAdapterI[] - adapters() + public void + flushBatchRequests() { java.util.LinkedList a = new java.util.LinkedList(); - java.util.Iterator i = _adapters.values().iterator(); - while(i.hasNext()) + synchronized(this) + { + java.util.Iterator i = _adapters.values().iterator(); + while(i.hasNext()) + { + a.add(i.next()); + } + } + java.util.Iterator p = a.iterator(); + while(p.hasNext()) { - a.add(i.next()); + ((Ice.ObjectAdapterI)p.next()).flushBatchRequests(); } - Ice.ObjectAdapterI[] arr = new Ice.ObjectAdapterI[a.size()]; - a.toArray(arr); - return arr; } // diff --git a/java/src/IceInternal/OutgoingConnectionFactory.java b/java/src/IceInternal/OutgoingConnectionFactory.java index ef4f4c30d2e..c748b99b96c 100644 --- a/java/src/IceInternal/OutgoingConnectionFactory.java +++ b/java/src/IceInternal/OutgoingConnectionFactory.java @@ -415,7 +415,11 @@ public class OutgoingConnectionFactory java.util.Iterator p = c.iterator(); while(p.hasNext()) { - ((Connection)p.next()).flushBatchRequest(); + Connection conn = (Connection)p.next(); + if(conn.isValidated()) + { + conn.flushBatchRequest(); + } } } |