activemq-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From chir...@apache.org
Subject svn commit: r559155 - /activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/region/RegionBroker.java
Date Tue, 24 Jul 2007 18:27:51 GMT
Author: chirino
Date: Tue Jul 24 11:27:49 2007
New Revision: 559155

URL: http://svn.apache.org/viewvc?view=rev&rev=559155
Log:
Fix for AMQ-1344 - Deadlock can occur when cerating and deleting many destinations concurrently

Modified:
    activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/region/RegionBroker.java

Modified: activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/region/RegionBroker.java
URL: http://svn.apache.org/viewvc/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/region/RegionBroker.java?view=diff&rev=559155&r1=559154&r2=559155
==============================================================================
--- activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/region/RegionBroker.java
(original)
+++ activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/region/RegionBroker.java
Tue Jul 24 11:27:49 2007
@@ -88,7 +88,7 @@
     protected final DestinationStatistics destinationStatistics = new DestinationStatistics();
     
     private final CopyOnWriteArrayList connections = new CopyOnWriteArrayList();
-    private final HashMap destinations = new HashMap();
+    private final Map destinations = new ConcurrentHashMap();
     private final CopyOnWriteArrayList brokerInfos = new CopyOnWriteArrayList();
 
     private final LongSequenceGenerator sequenceGenerator = new LongSequenceGenerator();
   
@@ -249,59 +249,60 @@
     }
 
     public Destination addDestination(ConnectionContext context, ActiveMQDestination destination)
throws Exception {
-  
-    	Destination answer;
-    	synchronized(destinations) {
-    		answer = (Destination) destinations.get(destination);
-            if( answer!=null )
-            	return answer;
-    	}
-    	
-        switch(destination.getDestinationType()) {
-        case ActiveMQDestination.QUEUE_TYPE:
-            answer  = queueRegion.addDestination(context, destination);
-            break;
-        case ActiveMQDestination.TOPIC_TYPE:
-            answer = topicRegion.addDestination(context, destination);
-            break;
-        case ActiveMQDestination.TEMP_QUEUE_TYPE:
-            answer = tempQueueRegion.addDestination(context, destination);
-            break;
-        case ActiveMQDestination.TEMP_TOPIC_TYPE:
-            answer = tempTopicRegion.addDestination(context, destination);
-            break;
-        default:
-            throw createUnknownDestinationTypeException(destination);
-        }
 
-    	synchronized(destinations) {
-            destinations.put(destination, answer);
-            return answer;
-    	}
-    }
-
-    public void removeDestination(ConnectionContext context,ActiveMQDestination destination,long
timeout) throws Exception{
-    	synchronized(destinations) {
-	        if( destinations.remove(destination)!=null ){
-	            switch(destination.getDestinationType()){
-	            case ActiveMQDestination.QUEUE_TYPE:
-	                queueRegion.removeDestination(context,destination,timeout);
-	                break;
-	            case ActiveMQDestination.TOPIC_TYPE:
-	                topicRegion.removeDestination(context,destination,timeout);
-	                break;
-	            case ActiveMQDestination.TEMP_QUEUE_TYPE:
-	                tempQueueRegion.removeDestination(context,destination,timeout);
-	                break;
-	            case ActiveMQDestination.TEMP_TOPIC_TYPE:
-	                tempTopicRegion.removeDestination(context,destination,timeout);
-	                break;
-	            default:
-	                throw createUnknownDestinationTypeException(destination);
-	            }
-	        }
-    	}
-    }
+		Destination answer;
+
+		answer = (Destination) destinations.get(destination);
+		if (answer != null)
+			return answer;
+
+		switch (destination.getDestinationType()) {
+		case ActiveMQDestination.QUEUE_TYPE:
+			answer = queueRegion.addDestination(context, destination);
+			break;
+		case ActiveMQDestination.TOPIC_TYPE:
+			answer = topicRegion.addDestination(context, destination);
+			break;
+		case ActiveMQDestination.TEMP_QUEUE_TYPE:
+			answer = tempQueueRegion.addDestination(context, destination);
+			break;
+		case ActiveMQDestination.TEMP_TOPIC_TYPE:
+			answer = tempTopicRegion.addDestination(context, destination);
+			break;
+		default:
+			throw createUnknownDestinationTypeException(destination);
+		}
+
+		destinations.put(destination, answer);
+		return answer;
+
+	}
+
+	public void removeDestination(ConnectionContext context,
+			ActiveMQDestination destination, long timeout) throws Exception {
+
+		if (destinations.remove(destination) != null) {
+			switch (destination.getDestinationType()) {
+			case ActiveMQDestination.QUEUE_TYPE:
+				queueRegion.removeDestination(context, destination, timeout);
+				break;
+			case ActiveMQDestination.TOPIC_TYPE:
+				topicRegion.removeDestination(context, destination, timeout);
+				break;
+			case ActiveMQDestination.TEMP_QUEUE_TYPE:
+				tempQueueRegion
+						.removeDestination(context, destination, timeout);
+				break;
+			case ActiveMQDestination.TEMP_TOPIC_TYPE:
+				tempTopicRegion
+						.removeDestination(context, destination, timeout);
+				break;
+			default:
+				throw createUnknownDestinationTypeException(destination);
+			}
+		}
+
+	}
     
     public void addDestinationInfo(ConnectionContext context,DestinationInfo info) throws
Exception{
         addDestination(context,info.getDestination());
@@ -314,14 +315,14 @@
     }
 
     public ActiveMQDestination[] getDestinations() throws Exception {
-    	ArrayList l;
-    	synchronized(destinations) {
-	        l = new ArrayList(destinations.values());
-    	}
-        ActiveMQDestination rc[] = new ActiveMQDestination[l.size()];
-        l.toArray(rc);
-        return rc;
-    }
+		ArrayList l;
+
+		l = new ArrayList(destinations.values());
+
+		ActiveMQDestination rc[] = new ActiveMQDestination[l.size()];
+		l.toArray(rc);
+		return rc;
+	}
 
 
     public void addSession(ConnectionContext context, SessionInfo info) throws Exception
{



Mime
View raw message