Expand the synchronization on the if(cw == null) { set cw }; if you
check a variable and then set it, the check and the set should be
synchronized (so it is atomic).
On Tue, Jul 11, 2006 at 10:58:27PM +0000, nextgens at freenetproject.org wrote:
> Author: nextgens
> Date: 2006-07-11 22:58:25 +0000 (Tue, 11 Jul 2006)
> New Revision: 9569
>
> Modified:
> trunk/freenet/src/freenet/node/CHKInsertSender.java
> Log:
> maybe fix some locking issues ... it needs to be reviewed
>
> Modified: trunk/freenet/src/freenet/node/CHKInsertSender.java
> ===================================================================
> --- trunk/freenet/src/freenet/node/CHKInsertSender.java 2006-07-11
> 22:35:55 UTC (rev 9568)
> +++ trunk/freenet/src/freenet/node/CHKInsertSender.java 2006-07-11
> 22:58:25 UTC (rev 9569)
> @@ -531,17 +531,16 @@
> private void finish(int code, PeerNode next) {
> Logger.minor(this, "Finished: "+code+" on "+this, new
> Exception("debug"));
> setStatusTime = System.currentTimeMillis();
> - synchronized(this) {
> +
> + synchronized(this) {
> if(status != NOT_FINISHED)
> - throw new IllegalStateException("finish() called with
> "+code+" when was already "+status);
> + throw new IllegalStateException("finish() called with
> "+code+" when was already "+status);
>
> if((code == ROUTE_NOT_FOUND) && !sentRequest)
> code = ROUTE_REALLY_NOT_FOUND;
> -
> - status = code;
> -
> +
> + status = code;
> notifyAll();
> -
> Logger.minor(this, "Set status code: "+getStatusString()+" on
> "+uid);
> }
> // Now wait for transfers, or for downstream transfer notifications.
> @@ -611,7 +610,9 @@
> Thread t;
>
> if(cw == null)
> - cw = new CompletionWaiter();
> + synchronized (this) {
> + cw = new CompletionWaiter();
> + }
> else
> return;
> t = new Thread(cw, "Completion waiter for "+uid);
> @@ -636,20 +637,19 @@
> int timeout;
> boolean noTimeLeft = false;
>
> - synchronized(this) {
> - long now = System.currentTimeMillis();
> - if((status == NOT_FINISHED) || (setStatusTime
> == -1)) {
> - // Wait 5 seconds, then try again
> - timeout = 5000;
> - } else {
> - // Completed, wait for everything
> - timeout =
> (int)Math.min(Integer.MAX_VALUE, (setStatusTime +
> TRANSFER_COMPLETION_TIMEOUT) - now);
> - }
> - if(timeout <= 0) {
> - noTimeLeft = true;
> - timeout = 1;
> - }
> + long now = System.currentTimeMillis();
> + if((status == NOT_FINISHED) || (setStatusTime == -1)) {
> + // Wait 5 seconds, then try again
> + timeout = 5000;
> + } else {
> + // Completed, wait for everything
> + timeout = (int)Math.min(Integer.MAX_VALUE,
> (setStatusTime + TRANSFER_COMPLETION_TIMEOUT) - now);
> }
> + if(timeout <= 0) {
> + noTimeLeft = true;
> + timeout = 1;
> + }
> +
>
> MessageFilter mf = null;
> for(int i=0;i<waiters.length;i++) {
>
> _______________________________________________
> cvs mailing list
> cvs at freenetproject.org
> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs
>
--
Matthew J Toseland - toad at amphibian.dyndns.org
Freenet Project Official Codemonkey - http://freenetproject.org/
ICTHUS - Nothing is impossible. Our Boss says so.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL:
<https://emu.freenetproject.org/pipermail/devl/attachments/20060712/3cba07d7/attachment.pgp>