diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2009-06-30 17:03:57 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2009-06-30 17:03:57 +0000 |
| commit | cf19dce8553d8a05f5d307835ea3c429d9eb63f2 (patch) | |
| tree | 7326cc88a21d711218179d722c667dfaeaae249b /src/SegmentMan.cc | |
| parent | cece2bc896b941d0c9b9d441460b5d32989268bd (diff) | |
2009-07-01 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
HTTP pipelining is now working. Fixed Segmention fault in
BitfieldMan's copy ctor.
* src/AbstractCommand.cc
* src/BitfieldMan.cc
* src/BitfieldMan.h
* src/DownloadCommand.cc
* src/HttpDownloadCommand.cc
* src/HttpRequest.cc
* src/SegmentMan.cc
* src/SegmentMan.h
* test/BitfieldManTest.cc
* test/SegmentManTest.cc
Diffstat (limited to 'src/SegmentMan.cc')
| -rw-r--r-- | src/SegmentMan.cc | 60 |
1 files changed, 54 insertions, 6 deletions
diff --git a/src/SegmentMan.cc b/src/SegmentMan.cc index a021accf..a321adab 100644 --- a/src/SegmentMan.cc +++ b/src/SegmentMan.cc @@ -170,6 +170,36 @@ SegmentHandle SegmentMan::getSegment(cuid_t cuid) { return checkoutSegment(cuid, piece); } +void SegmentMan::getSegment(std::deque<SharedHandle<Segment> >& segments, + cuid_t cuid, + const SharedHandle<FileEntry>& fileEntry, + size_t maxSegments) +{ + BitfieldMan filter(_ignoreBitfield); + filter.enableFilter(); + filter.addNotFilter(fileEntry->getOffset(), fileEntry->getLength()); + std::deque<SharedHandle<Segment> > pending; + while(segments.size() < maxSegments) { + SharedHandle<Segment> segment = + checkoutSegment(cuid, + _pieceStorage->getSparseMissingUnusedPiece + (filter.getFilterBitfield(), filter.getBitfieldLength())); + if(segment.isNull()) { + break; + } + if(segment->getPositionToWrite() < fileEntry->getOffset() || + fileEntry->getLastOffset() <= segment->getPositionToWrite()) { + pending.push_back(segment); + } else { + segments.push_back(segment); + } + } + for(std::deque<SharedHandle<Segment> >::const_iterator i = pending.begin(); + i != pending.end(); ++i) { + cancelSegment(cuid, *i); + } +} + SegmentHandle SegmentMan::getSegment(cuid_t cuid, size_t index) { if(_downloadContext->getNumPieces() <= index) { return SharedHandle<Segment>(); @@ -177,17 +207,35 @@ SegmentHandle SegmentMan::getSegment(cuid_t cuid, size_t index) { return checkoutSegment(cuid, _pieceStorage->getMissingPiece(index)); } +void SegmentMan::cancelSegment(const SharedHandle<Segment>& segment) +{ + _pieceStorage->cancelPiece(segment->getPiece()); + _segmentWrittenLengthMemo[segment->getIndex()] = segment->getWrittenLength(); + logger->debug("Memorized segment index=%u, writtenLength=%u", + segment->getIndex(), segment->getWrittenLength()); +} + void SegmentMan::cancelSegment(cuid_t cuid) { for(SegmentEntries::iterator itr = usedSegmentEntries.begin(); itr != usedSegmentEntries.end();) { if((*itr)->cuid == cuid) { - _pieceStorage->cancelPiece((*itr)->segment->getPiece()); - _segmentWrittenLengthMemo[(*itr)->segment->getIndex()] = - (*itr)->segment->getWrittenLength(); - logger->debug("Memorized segment index=%u, writtenLength=%u", - (*itr)->segment->getIndex(), - (*itr)->segment->getWrittenLength()); + cancelSegment((*itr)->segment); + itr = usedSegmentEntries.erase(itr); + } else { + ++itr; + } + } +} + +void SegmentMan::cancelSegment +(cuid_t cuid, const SharedHandle<Segment>& segment) +{ + for(SegmentEntries::iterator itr = usedSegmentEntries.begin(); + itr != usedSegmentEntries.end();) { + if((*itr)->cuid == cuid && (*itr)->segment == segment) { + cancelSegment((*itr)->segment); itr = usedSegmentEntries.erase(itr); + break; } else { ++itr; } |
