Author: toad
Date: 2007-05-03 22:02:35 +0000 (Thu, 03 May 2007)
New Revision: 13137

Modified:
   trunk/freenet/src/freenet/support/RandomGrabArray.java
Log:
Deal more efficiently with a bunch of items getting cancelled simultaneously.
(Looping in SectoredRGA locking Yarrow causing contention observed...)

Modified: trunk/freenet/src/freenet/support/RandomGrabArray.java
===================================================================
--- trunk/freenet/src/freenet/support/RandomGrabArray.java      2007-05-03 
22:01:55 UTC (rev 13136)
+++ trunk/freenet/src/freenet/support/RandomGrabArray.java      2007-05-03 
22:02:35 UTC (rev 13137)
@@ -69,10 +69,13 @@
                                        ret.setParentGrabArray(null);
                                        return ret;
                                }
-                               reqs[i] = reqs[--index];
-                               reqs[index] = null;
-                               if(oret != null)
-                                       contents.remove(oret);
+                               do {
+                                       reqs[i] = reqs[--index];
+                                       reqs[index] = null;
+                                       if(oret != null)
+                                               contents.remove(oret);
+                                       oret = reqs[i];
+                               } while (index > i && (oret == null || 
oret.isCancelled()));
                                // Shrink array
                                if((index < reqs.length / 4) && (reqs.length > 
MIN_SIZE)) {
                                        // Shrink array


Reply via email to