Author: toad
Date: 2008-01-12 21:05:45 +0000 (Sat, 12 Jan 2008)
New Revision: 17033

Modified:
   trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
   trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
Log:
Avoid nested locking that may cause deadlocks: when start finishing, or when 
fail, remove the sub-segments. Notify them only at that point that they are 
cancelled.

Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java 
2008-01-12 21:00:56 UTC (rev 17032)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java 
2008-01-12 21:05:45 UTC (rev 17033)
@@ -180,6 +180,7 @@
                                }
                        }
                }
+               removeSubSegments();
                parentFetcher.parent.completedBlock(dontNotify);
                seg.possiblyRemoveFromParent();
                if(decodeNow) {

Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java      
2008-01-12 21:00:56 UTC (rev 17032)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java      
2008-01-12 21:05:45 UTC (rev 17033)
@@ -30,6 +30,7 @@
        final Vector blockNums;
        final FetchContext ctx;
        private static boolean logMINOR;
+       private boolean cancelled;

        SplitFileFetcherSubSegment(SplitFileFetcherSegment segment, int 
retryCount) {
                super(segment.parentFetcher.parent);
@@ -230,8 +231,8 @@
                } else return false;
        }

-       public boolean isCancelled() {
-               return segment.isFinished() || segment.isFinishing();
+       public synchronized boolean isCancelled() {
+               return cancelled;
        }

        public boolean isSSK() {
@@ -297,6 +298,7 @@
                unregister();
                synchronized(this) {
                        blockNums.clear();
+                       cancelled = true;
                }
                segment.removeSeg(this);
        }


Reply via email to