Author: robert
Date: 2008-01-09 16:47:15 +0000 (Wed, 09 Jan 2008)
New Revision: 16983

Modified:
   trunk/freenet/src/freenet/node/NodeClientCore.java
   trunk/freenet/src/freenet/node/RequestHandler.java
   trunk/freenet/src/freenet/node/RequestSender.java
Log:
add timeout to waitUntilStatusChange to free RequestHandler thread if obsolete


Modified: trunk/freenet/src/freenet/node/NodeClientCore.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeClientCore.java  2008-01-09 16:27:26 UTC 
(rev 16982)
+++ trunk/freenet/src/freenet/node/NodeClientCore.java  2008-01-09 16:47:15 UTC 
(rev 16983)
@@ -465,7 +465,7 @@
                boolean rejectedOverload = false;
                short waitStatus = 0;
                while(true) {
-                       waitStatus = rs.waitUntilStatusChange(waitStatus);
+                       waitStatus = rs.waitUntilStatusChange(waitStatus, 
120000);
                        if((!rejectedOverload) && (waitStatus & 
RequestSender.WAIT_REJECTED_OVERLOAD) != 0) {
                                // See below; inserts count both
                                requestStarters.rejectedOverload(false, false);
@@ -578,7 +578,7 @@
                boolean rejectedOverload = false;
                short waitStatus = 0;
                while(true) {
-                       waitStatus = rs.waitUntilStatusChange(waitStatus);
+                       waitStatus = rs.waitUntilStatusChange(waitStatus, 
120000);
                        if((!rejectedOverload) && (waitStatus & 
RequestSender.WAIT_REJECTED_OVERLOAD) != 0) {
                                requestStarters.rejectedOverload(true, false);
                                rejectedOverload = true;

Modified: trunk/freenet/src/freenet/node/RequestHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestHandler.java  2008-01-09 16:27:26 UTC 
(rev 16982)
+++ trunk/freenet/src/freenet/node/RequestHandler.java  2008-01-09 16:47:15 UTC 
(rev 16983)
@@ -158,9 +158,9 @@

         while(true) {

-               waitStatus = rs.waitUntilStatusChange(waitStatus);
+               waitStatus = rs.waitUntilStatusChange(waitStatus, 
responseDeadline-System.currentTimeMillis());

-                       if (System.currentTimeMillis() > responseDeadline) {
+                       if (System.currentTimeMillis() >= responseDeadline) {
                                applyByteCounts();
                                return;
                        }

Modified: trunk/freenet/src/freenet/node/RequestSender.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestSender.java   2008-01-09 16:27:26 UTC 
(rev 16982)
+++ trunk/freenet/src/freenet/node/RequestSender.java   2008-01-09 16:47:15 UTC 
(rev 16983)
@@ -641,8 +641,9 @@
      * @return Bitmask indicating present situation. Can be fed back to this 
function,
      * if nonzero.
      */
-    public synchronized short waitUntilStatusChange(short mask) {
+    public synchronized short waitUntilStatusChange(short mask, long timeout) {
        if(mask == WAIT_ALL) throw new IllegalArgumentException("Cannot ignore 
all!");
+               long startTime=System.currentTimeMillis();
         while(true) {
                short current = mask; // If any bits are set already, we ignore 
those states.

@@ -657,8 +658,16 @@

                if(current != mask) return current;

+                       long timeLeft = System.currentTimeMillis() - 
(startTime+timeout);
+                       
+                       if (timeLeft <= 0) {
+                               Logger.normal(this, 
"RequestSender.waitUntilStatusChange timed out");
+                               return current;
+                       }
+                       
             try {
-                wait(10000);
+                               //Wait at most ten seconds per-loop
+                wait(Math.min(timeLeft, 10000));
             } catch (InterruptedException e) {
                 // Ignore
             }


Reply via email to