Author: rhs
Date: Thu Aug 15 16:31:22 2013
New Revision: 1514351

URL: http://svn.apache.org/r1514351
Log:
PROTON-393: fixed concurrent modification exception

Modified:
    
qpid/proton/trunk/proton-j/proton/src/main/java/org/apache/qpid/proton/messenger/impl/MessengerImpl.java
    qpid/proton/trunk/tests/python/proton_tests/messenger.py

Modified: 
qpid/proton/trunk/proton-j/proton/src/main/java/org/apache/qpid/proton/messenger/impl/MessengerImpl.java
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/proton/src/main/java/org/apache/qpid/proton/messenger/impl/MessengerImpl.java?rev=1514351&r1=1514350&r2=1514351&view=diff
==============================================================================
--- 
qpid/proton/trunk/proton-j/proton/src/main/java/org/apache/qpid/proton/messenger/impl/MessengerImpl.java
 (original)
+++ 
qpid/proton/trunk/proton-j/proton/src/main/java/org/apache/qpid/proton/messenger/impl/MessengerImpl.java
 Thu Aug 15 16:31:22 2013
@@ -23,8 +23,10 @@ package org.apache.qpid.proton.messenger
 import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.ArrayList;
 import java.util.EnumSet;
 import java.util.Iterator;
+import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -78,6 +80,7 @@ public class MessengerImpl implements Me
     private int _distributed;
     private TrackerQueue _incoming = new TrackerQueue();
     private TrackerQueue _outgoing = new TrackerQueue();
+    private List<Connector> _awaitingDestruction = new ArrayList<Connector>();
 
 
     /**
@@ -418,6 +421,15 @@ public class MessengerImpl implements Me
         return size;
     }
 
+    private void bringDestruction()
+    {
+        for (Connector<?> c : _awaitingDestruction)
+        {
+            c.destroy();
+        }
+        _awaitingDestruction.clear();
+    }
+
     private void processAllConnectors()
     {
         distributeCredit();
@@ -435,6 +447,8 @@ public class MessengerImpl implements Me
             }
             processEndpoints(c);
         }
+        bringDestruction();
+        distributeCredit();
     }
 
     private void processActive()
@@ -470,6 +484,8 @@ public class MessengerImpl implements Me
             }
             processEndpoints(c);
         }
+        bringDestruction();
+        distributeCredit();
     }
 
     private void processEndpoints(Connector c)
@@ -527,11 +543,8 @@ public class MessengerImpl implements Me
 
         if (c.isClosed())
         {
+            _awaitingDestruction.add(c);
             reclaimCredit(connection);
-            c.destroy();
-            // XXX: could we do this once at the end of the loop
-            // instead of every time we reclaim?
-            distributeCredit();
         }
         else
         {

Modified: qpid/proton/trunk/tests/python/proton_tests/messenger.py
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/tests/python/proton_tests/messenger.py?rev=1514351&r1=1514350&r2=1514351&view=diff
==============================================================================
--- qpid/proton/trunk/tests/python/proton_tests/messenger.py (original)
+++ qpid/proton/trunk/tests/python/proton_tests/messenger.py Thu Aug 15 
16:31:22 2013
@@ -48,17 +48,9 @@ class Test(common.Test):
     self.client.start()
 
   def _safelyStopClient(self):
-    existing_exception = None
     self.server.interrupt()
-    try:
-      self.client.stop()
-      self.client = None
-    except:
-      print "Client failed to stop due to: %s" % sys.exc_info()[1]
-      if existing_exception:
-        raise existing_exception
-      else:
-        raise
+    self.client.stop()
+    self.client = None
 
   def teardown(self):
     try:



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to