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();
}