summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2013-04-23 23:00:11 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2013-04-23 23:00:11 +0900
commitb05454657f6e13abee94f74af3ce42c34ffb4fe2 (patch)
treeae91e2a2d233e1d45059c9630522b9fa9eb1f5ad
parent9665a3491d8916ead0904491c559afe63fe08ad7 (diff)
Fix cached data is not flushed when downloaded data is less than 16KiB
-rw-r--r--src/SegmentMan.cc14
1 files changed, 7 insertions, 7 deletions
diff --git a/src/SegmentMan.cc b/src/SegmentMan.cc
index 775615a8..e2c8947f 100644
--- a/src/SegmentMan.cc
+++ b/src/SegmentMan.cc
@@ -282,14 +282,8 @@ void SegmentMan::cancelSegmentInternal
A2_LOG_DEBUG(fmt("Canceling segment#%lu",
static_cast<unsigned long>(segment->getIndex())));
const SharedHandle<Piece>& piece = segment->getPiece();
- piece->setUsedBySegment(false);
- pieceStorage_->cancelPiece(piece, cuid);
- segmentWrittenLengthMemo_[segment->getIndex()] = segment->getWrittenLength();
- A2_LOG_DEBUG(fmt("Memorized segment index=%lu, writtenLength=%d",
- static_cast<unsigned long>(segment->getIndex()),
- segment->getWrittenLength()));
// TODO In PieceStorage::cancelPiece(), WrDiskCacheEntry may be
- // released.
+ // released. Flush first.
if(piece->getWrDiskCacheEntry()) {
// Flush cached data here, because the cached data may be overlapped
// if BT peers are involved.
@@ -300,6 +294,12 @@ void SegmentMan::cancelSegmentInternal
// TODO Exception may cause some segments (pieces) are not
// canceled.
}
+ piece->setUsedBySegment(false);
+ pieceStorage_->cancelPiece(piece, cuid);
+ segmentWrittenLengthMemo_[segment->getIndex()] = segment->getWrittenLength();
+ A2_LOG_DEBUG(fmt("Memorized segment index=%lu, writtenLength=%d",
+ static_cast<unsigned long>(segment->getIndex()),
+ segment->getWrittenLength()));
}
void SegmentMan::cancelSegment(cuid_t cuid) {