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);
}