[Jboss-cvs] JBoss Messaging SVN: r1200 - trunk/src/main/org/jboss/messaging/core/local
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Sat Aug 5 04:33:02 EDT 2006
Author: ovidiu.feodorov at jboss.com
Date: 2006-08-05 04:33:01 -0400 (Sat, 05 Aug 2006)
New Revision: 1200
Modified:
trunk/src/main/org/jboss/messaging/core/local/RoundRobinPointToPointRouter.java
Log:
fix for http://jira.jboss.org/jira/browse/JBMESSAGING-491
Modified: trunk/src/main/org/jboss/messaging/core/local/RoundRobinPointToPointRouter.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/local/RoundRobinPointToPointRouter.java 2006-08-05 04:48:44 UTC (rev 1199)
+++ trunk/src/main/org/jboss/messaging/core/local/RoundRobinPointToPointRouter.java 2006-08-05 08:33:01 UTC (rev 1200)
@@ -60,7 +60,7 @@
private boolean trace = log.isTraceEnabled();
- //It's important that we're actually using an ArrayList for fast array access
+ // it's important that we're actually using an ArrayList for fast array access
protected ArrayList receivers;
protected int pos;
@@ -70,7 +70,6 @@
public RoundRobinPointToPointRouter()
{
receivers = new ArrayList();
-
reset();
}
@@ -79,8 +78,9 @@
public Set handle(DeliveryObserver observer, Routable routable, Transaction tx)
{
Set deliveries = new HashSet();
-
boolean selectorRejected = false;
+ ArrayList receiversCopy = null;
+ int firstPos;
synchronized(receivers)
{
@@ -88,53 +88,57 @@
{
return deliveries;
}
-
- int firstPos = pos;
-
- while (true)
+ // make a copy to avoid deadlock (http://jira.jboss.org/jira/browse/JBMESSAGING-491)
+ int crtSize = receivers.size();
+ receiversCopy = new ArrayList(crtSize);
+ receiversCopy.addAll(receivers);
+ if (pos >= crtSize)
{
- Receiver receiver = (Receiver)receivers.get(pos);
-
- try
+ pos = 0;
+ }
+ firstPos = pos;
+ }
+
+ while (true)
+ {
+ Receiver receiver = (Receiver)receiversCopy.get(pos);
+
+ try
+ {
+ Delivery d = receiver.handle(observer, routable, tx);
+
+ if (trace) { log.trace("receiver " + receiver + " handled " + routable + " and returned " + d); }
+
+ if (d != null && !d.isCancelled())
{
- Delivery d = receiver.handle(observer, routable, tx);
-
- if (trace) { log.trace("receiver " + receiver + " handled " + routable + " and returned " + d); }
-
- if (d != null && !d.isCancelled())
+ if (d.isSelectorAccepted())
{
- if (d.isSelectorAccepted())
- {
- // deliver to the first receiver that accepts
- deliveries.add(d);
-
- incPos();
-
- break;
- }
- else
- {
- selectorRejected = true;
- }
+ // deliver to the first receiver that accepts
+ deliveries.add(d);
+ incPos();
+ break;
}
+ else
+ {
+ selectorRejected = true;
+ }
}
- catch(Throwable t)
- {
- // broken receiver - log the exception and ignore it
- log.error("The receiver " + receiver + " is broken", t);
- }
-
- incPos();
-
- //If we've tried them all then we break
-
- if (pos == firstPos)
- {
- break;
- }
}
+ catch(Throwable t)
+ {
+ // broken receiver - log the exception and ignore it
+ log.error("The receiver " + receiver + " is broken", t);
+ }
+
+ incPos();
+
+ // if we've tried them all then we break
+ if (pos == firstPos)
+ {
+ break;
+ }
}
-
+
if (deliveries.isEmpty() && selectorRejected)
{
deliveries.add(new SimpleDelivery(null, null, true, false));
@@ -209,8 +213,7 @@
protected void reset()
{
- //Reset back to the first one
-
+ // Reset back to the first one
pos = 0;
}
@@ -218,9 +221,8 @@
{
pos++;
- //Wrap around
-
- if (pos == receivers.size())
+ // Wrap around
+ if (pos >= receivers.size())
{
pos = 0;
}
More information about the jboss-cvs-commits
mailing list