[jboss-cvs] JBoss Messaging SVN: r2327 - trunk/src/main/org/jboss/jms/server/endpoint.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Feb 15 14:53:01 EST 2007


Author: timfox
Date: 2007-02-15 14:53:01 -0500 (Thu, 15 Feb 2007)
New Revision: 2327

Modified:
   trunk/src/main/org/jboss/jms/server/endpoint/ServerConnectionEndpoint.java
   trunk/src/main/org/jboss/jms/server/endpoint/ServerSessionEndpoint.java
Log:
http://jira.jboss.org/jira/browse/JBMESSAGING-836


Modified: trunk/src/main/org/jboss/jms/server/endpoint/ServerConnectionEndpoint.java
===================================================================
--- trunk/src/main/org/jboss/jms/server/endpoint/ServerConnectionEndpoint.java	2007-02-15 18:56:33 UTC (rev 2326)
+++ trunk/src/main/org/jboss/jms/server/endpoint/ServerConnectionEndpoint.java	2007-02-15 19:53:01 UTC (rev 2327)
@@ -356,18 +356,23 @@
             return;
          }
    
+         //We clone to avoid deadlock http://jira.jboss.org/jira/browse/JBMESSAGING-836
+         Map sessionsClone;
          synchronized (sessions)
          {
-            for(Iterator i = sessions.values().iterator(); i.hasNext(); )
-            {
-               ServerSessionEndpoint sess = (ServerSessionEndpoint)i.next();
-      
-               sess.localClose();
-            }
-            
-            sessions.clear();
+            sessionsClone = new HashMap(sessions);
          }
          
+         for(Iterator i = sessionsClone.values().iterator(); i.hasNext(); )
+         {
+            ServerSessionEndpoint sess = (ServerSessionEndpoint)i.next();
+   
+            sess.localClose();
+         }
+         
+         sessions.clear();
+         
+         
          synchronized (temporaryDestinations)
          {
             for(Iterator i = temporaryDestinations.iterator(); i.hasNext(); )
@@ -702,16 +707,21 @@
    
    private void setStarted(boolean s) throws Throwable
    {
+      //We clone to avoid deadlock http://jira.jboss.org/jira/browse/JBMESSAGING-836
+      Map sessionsClone = null;
+      
       synchronized(sessions)
       {
-         for (Iterator i = sessions.values().iterator(); i.hasNext(); )
-         {
-            ServerSessionEndpoint sd = (ServerSessionEndpoint)i.next();
-            
-            sd.setStarted(s);
-         }
-         started = s;
+         sessionsClone = new HashMap(sessions);
       }
+      
+      for (Iterator i = sessionsClone.values().iterator(); i.hasNext(); )
+      {
+         ServerSessionEndpoint sd = (ServerSessionEndpoint)i.next();
+         
+         sd.setStarted(s);
+      }
+      started = s;      
    }   
     
    private void processTransaction(ClientTransaction txState,

Modified: trunk/src/main/org/jboss/jms/server/endpoint/ServerSessionEndpoint.java
===================================================================
--- trunk/src/main/org/jboss/jms/server/endpoint/ServerSessionEndpoint.java	2007-02-15 18:56:33 UTC (rev 2326)
+++ trunk/src/main/org/jboss/jms/server/endpoint/ServerSessionEndpoint.java	2007-02-15 19:53:01 UTC (rev 2327)
@@ -826,26 +826,36 @@
       
       if (trace) log.trace(this + " close()");
             
+      //We clone to avoid deadlock http://jira.jboss.org/jira/browse/JBMESSAGING-836
+      Map consumersClone;
       synchronized (consumers)
-      {            
-         for( Iterator i = consumers.values().iterator(); i.hasNext(); )
-         {
-            ((ServerConsumerEndpoint)i.next()).localClose();
-         }  
-         
-         consumers.clear();
+      {
+         consumersClone = new HashMap(consumers);
       }
       
+      for( Iterator i = consumersClone.values().iterator(); i.hasNext(); )
+      {
+         ((ServerConsumerEndpoint)i.next()).localClose();
+      }  
+      
+      consumers.clear();
+      
+      
+      //We clone to avoid deadlock http://jira.jboss.org/jira/browse/JBMESSAGING-836
+      Map browsersClone;
       synchronized (browsers)
-      {            
-         for( Iterator i = browsers.values().iterator(); i.hasNext(); )
-         {
-            ((ServerBrowserEndpoint)i.next()).localClose();
-         }  
-         
-         browsers.clear();
+      {
+         browsersClone = new HashMap(browsers);
       }
       
+      for( Iterator i = browsersClone.values().iterator(); i.hasNext(); )
+      {
+         ((ServerBrowserEndpoint)i.next()).localClose();
+      }  
+      
+      browsers.clear();
+      
+      
       //Now cancel any remaining deliveries in reverse delivery order
       //Note we don't maintain order using a LinkedHashMap since then we lose
       //concurrency since we would have to lock it exclusively
@@ -953,21 +963,25 @@
     */
    void setStarted(boolean s) throws Throwable
    {
+      //We clone to prevent deadlock http://jira.jboss.org/jira/browse/JBMESSAGING-836
+      Map consumersClone;
       synchronized(consumers)
       {
-         for(Iterator i = consumers.values().iterator(); i.hasNext(); )
+         consumersClone = new HashMap(consumers);
+      }
+      
+      for(Iterator i = consumersClone.values().iterator(); i.hasNext(); )
+      {
+         ServerConsumerEndpoint sce = (ServerConsumerEndpoint)i.next();
+         if (s)
          {
-            ServerConsumerEndpoint sce = (ServerConsumerEndpoint)i.next();
-            if (s)
-            {
-               sce.start();
-            }
-            else
-            {
-               sce.stop();
-            }
+            sce.start();
          }
-      }
+         else
+         {
+            sce.stop();
+         }
+      }      
    } 
 
    // Protected ------------------------------------------------------------------------------------




More information about the jboss-cvs-commits mailing list