Author: toad
Date: 2007-03-16 23:16:52 +0000 (Fri, 16 Mar 2007)
New Revision: 12164

Modified:
   trunk/freenet/src/freenet/node/SendableRequest.java
   trunk/freenet/src/freenet/support/RandomGrabArray.java
   trunk/freenet/src/freenet/support/RandomGrabArrayItem.java
Log:
Make RandomGrabArrayItem's (including SendableRequest) remember the 
RandomGrabArray they are registered on.
This will make deletion much easier/more reliable.

Modified: trunk/freenet/src/freenet/node/SendableRequest.java
===================================================================
--- trunk/freenet/src/freenet/node/SendableRequest.java 2007-03-16 23:13:05 UTC 
(rev 12163)
+++ trunk/freenet/src/freenet/node/SendableRequest.java 2007-03-16 23:16:52 UTC 
(rev 12164)
@@ -1,6 +1,7 @@
 package freenet.node;

 import freenet.client.async.ClientRequester;
+import freenet.support.RandomGrabArray;
 import freenet.support.RandomGrabArrayItem;

 /**
@@ -9,6 +10,8 @@
  */
 public abstract class SendableRequest implements RandomGrabArrayItem {

+       protected RandomGrabArray parentGrabArray;
+       
        /** Get the priority class of the request. */
        public abstract short getPriorityClass();

@@ -26,4 +29,16 @@
        /** Get the ClientRequest */
        public abstract ClientRequester getClientRequest();

+       public synchronized RandomGrabArray getParentGrabArray() {
+               return parentGrabArray;
+       }
+       
+       public boolean knowsParentGrabArray() {
+               return true;
+       }
+       
+       public synchronized void setParentGrabArray(RandomGrabArray parent) {
+               parentGrabArray = parent;
+       }
+       
 }

Modified: trunk/freenet/src/freenet/support/RandomGrabArray.java
===================================================================
--- trunk/freenet/src/freenet/support/RandomGrabArray.java      2007-03-16 
23:13:05 UTC (rev 12163)
+++ trunk/freenet/src/freenet/support/RandomGrabArray.java      2007-03-16 
23:16:52 UTC (rev 12164)
@@ -29,7 +29,8 @@
                contents = new HashSet();
        }

-       public synchronized void add(RandomGrabArrayItem req) {
+       public void add(RandomGrabArrayItem req) {
+               synchronized(this) {
                if(contents.contains(req)) return;
                if(req.isCancelled()) {
                        if(Logger.shouldLog(Logger.MINOR, this))
@@ -43,9 +44,13 @@
                        reqs = r;
                }
                reqs[index++] = req;
+               }
+               req.setParentGrabArray(this);
        }

-       public synchronized RandomGrabArrayItem removeRandom() {
+       public RandomGrabArrayItem removeRandom() {
+               RandomGrabArrayItem ret;
+               synchronized(this) {
                boolean logMINOR = Logger.shouldLog(Logger.MINOR, this);
                while(true) {
                        if(index == 0) {
@@ -53,7 +58,7 @@
                                return null;
                        }
                        int i = rand.nextInt(index);
-                       RandomGrabArrayItem ret = reqs[i];
+                       ret = reqs[i];
                        if(ret != null && !ret.canRemove()) return ret;
                        reqs[i] = reqs[--index];
                        reqs[index] = null;
@@ -67,20 +72,26 @@
                                System.arraycopy(reqs, 0, r, 0, r.length);
                                reqs = r;
                        }
-                       if((ret != null) && !ret.isCancelled()) return ret;
+                       if((ret != null) && !ret.isCancelled()) break;
                }
+               }
+               ret.setParentGrabArray(null);
+               return ret;
        }

-       public synchronized void remove(RandomGrabArrayItem it) {
+       public void remove(RandomGrabArrayItem it) {
+               synchronized(this) {
                if(!contents.contains(it)) return;
                contents.remove(it);
                for(int i=0;i<index;i++) {
                        if((reqs[i] == it) || reqs[i].equals(it)) {
                                reqs[i] = reqs[--index];
                                reqs[index] = null;
-                               return;
+                               break;
                        }
                }
+               }
+               it.setParentGrabArray(null);
        }

        public synchronized boolean isEmpty() {

Modified: trunk/freenet/src/freenet/support/RandomGrabArrayItem.java
===================================================================
--- trunk/freenet/src/freenet/support/RandomGrabArrayItem.java  2007-03-16 
23:13:05 UTC (rev 12163)
+++ trunk/freenet/src/freenet/support/RandomGrabArrayItem.java  2007-03-16 
23:16:52 UTC (rev 12164)
@@ -15,4 +15,12 @@
         * it needs to return true if there are less than two requests on this 
object. */
        public boolean canRemove();

+       /** Does this RandomGrabArrayItem support remembering where it is 
registered? */
+       public boolean knowsParentGrabArray();
+       
+       /** Notify the item that it has been registered on a specific 
RandomGrabArray */
+       public void setParentGrabArray(RandomGrabArray parent);
+       
+       /** If the item remembers its parent RandomGrabArray, return it */
+       public RandomGrabArray getParentGrabArray();
 }


Reply via email to