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>