Nice one! That code is messy...

On Tuesday 18 December 2007 22:15, robert at freenetproject.org wrote:
> Author: robert
> Date: 2007-12-18 22:15:14 +0000 (Tue, 18 Dec 2007)
> New Revision: 16705
> 
> Modified:
>    trunk/freenet/src/freenet/node/CHKInsertSender.java
> Log:
> Factor out CompletionWaiter (use 1/2 the threads for inserts; could still be 
simplied...)
> 
> 
> Modified: trunk/freenet/src/freenet/node/CHKInsertSender.java
> ===================================================================
> --- trunk/freenet/src/freenet/node/CHKInsertSender.java       2007-12-18 
> 21:50:24 
UTC (rev 16704)
> +++ trunk/freenet/src/freenet/node/CHKInsertSender.java       2007-12-18 
> 22:15:14 
UTC (rev 16705)
> @@ -143,9 +143,6 @@
>      /** Has a transfer timed out, either directly or downstream? */
>      private boolean transferTimedOut;
>      
> -    /** Runnable which waits for completion of all transfers */
> -    private CompletionWaiter cw;
> -
>      private int status = -1;
>      /** Still running */
>      static final int NOT_FINISHED = -1;
> @@ -367,7 +364,6 @@
>               backgroundTransfers.notifyAll();
>              }
>              ac.start();
> -            makeCompletionWaiter();
>  
>              while (true) {
>  
> @@ -532,26 +528,20 @@
>               notifyAll();
>               if(logMINOR) Logger.minor(this, "Set status 
code: "+getStatusString()+" on "+uid);
>          }
> +             
>          // Now wait for transfers, or for downstream transfer 
notifications.
> -        if(cw != null) {
> +             synchronized(backgroundTransfers) {
> +                     if (!backgroundTransfers.isEmpty()) {
> +                             waitForBackgroundTransferCompletions();
> +                     } else {
> +                             if(logMINOR) Logger.minor(this, "No background 
> transfers");
> +                     }
> +             }
> +        
>               synchronized(this) {
> -                     while(!allTransfersCompleted && cw!=null) {
> -                             try {
> -                                     wait(10*1000);
> -                             } catch (InterruptedException e) {
> -                                     // Try again
> -                             }
> -                     }
> -             }
> -        }
> -             if (cw==null) {
> -             if(logMINOR) Logger.minor(this, "No completion waiter");
> -             // There weren't any transfers
> -             synchronized(this) {
>                       allTransfersCompleted = true;
>                       notifyAll();
>               }
> -        }
>          
>          if(status == SUCCESS && next != null)
>               next.onSuccess(true, false);
> @@ -583,7 +573,8 @@
>       synchronized(this) {
>               status = RECEIVE_FAILED;
>               allTransfersCompleted = true;
> -             cw = null; // Effectively ... we certainly don't want to wait 
> for it.
> +                     //FIXME: Won't this leak unclaimed FIFO elements?
> +             backgroundTransfers.clear(); // Effectively ... we certainly 
> don't 
want to wait for it.
>               notifyAll();
>       }
>       // Do not call finish(), that can only be called on the main thread 
and it will block.
> @@ -613,28 +604,13 @@
>       public synchronized boolean sentRequest() {
>               return sentRequest;
>       }
> -     
> -     private void makeCompletionWaiter() {
> -             if(logMINOR)
> -                     Logger.minor(this, "Creating completion waiter for 
> "+uid);
> -             synchronized (this) {
> -                     if(cw == null)
> -                             cw = new CompletionWaiter();
> -                     else
> -                             return;
> -             }
> -             node.executor.execute(cw, "Completion waiter for "+uid);
> -     }
> -     
> -     private class CompletionWaiter implements Runnable {
>               
> -             public void run() {
> +             public void waitForBackgroundTransferCompletions() {
>                       try {
>                   freenet.support.Logger.OSThread.logPID(this);
>                       if(logMINOR) Logger.minor(this, "Starting "+this);
>                       
> -                     // Wait for the request to reach a terminal stage.
> -                     waitForStatus();
> +                     // We are presently at a terminal stage.
>                       
>                       BackgroundTransfer[] transfers;
>                       synchronized(backgroundTransfers) {
> @@ -781,10 +757,6 @@
>                       }
>               }
>  
> -             public String toString() {
> -                     return super.toString()+" for "+uid;
> -             }
> -     }
>  
>       public synchronized boolean completed() {
>               return allTransfersCompleted;
> @@ -855,6 +827,6 @@
>       }
>  
>       public synchronized boolean startedSendingData() {
> -             return cw != null;
> +             return !backgroundTransfers.isEmpty();
>       }
>  }
> 
> _______________________________________________
> cvs mailing list
> cvs at freenetproject.org
> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs
> 
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: 
<https://emu.freenetproject.org/pipermail/devl/attachments/20071219/cdaab9ae/attachment.pgp>

Reply via email to