summaryrefslogtreecommitdiff
path: root/src/AbstractCommand.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2009-06-30 17:03:57 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2009-06-30 17:03:57 +0000
commitcf19dce8553d8a05f5d307835ea3c429d9eb63f2 (patch)
tree7326cc88a21d711218179d722c667dfaeaae249b /src/AbstractCommand.cc
parentcece2bc896b941d0c9b9d441460b5d32989268bd (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/AbstractCommand.cc')
-rw-r--r--src/AbstractCommand.cc38
1 files changed, 24 insertions, 14 deletions
diff --git a/src/AbstractCommand.cc b/src/AbstractCommand.cc
index 54e96e67..992d2100 100644
--- a/src/AbstractCommand.cc
+++ b/src/AbstractCommand.cc
@@ -156,18 +156,28 @@ bool AbstractCommand::execute() {
if(!_requestGroup->getPieceStorage().isNull()) {
_segments.clear();
_requestGroup->getSegmentMan()->getInFlightSegment(_segments, cuid);
- size_t maxSegments = req.isNull()?1:req->getMaxPipelinedRequest();
- while(_segments.size() < maxSegments) {
- SegmentHandle segment = _requestGroup->getSegmentMan()->getSegment(cuid);
- if(segment.isNull()) {
- break;
+ if(req.isNull() || req->getMaxPipelinedRequest() == 1) {
+ if(_segments.empty()) {
+ SharedHandle<Segment> segment =
+ _requestGroup->getSegmentMan()->getSegment(cuid);
+ if(!segment.isNull()) {
+ _segments.push_back(segment);
+ }
+ }
+ if(_segments.empty()) {
+ // TODO socket could be pooled here if pipelining is enabled...
+ logger->info(MSG_NO_SEGMENT_AVAILABLE, cuid);
+ return true;
+ }
+ } else {
+ size_t maxSegments = req->getMaxPipelinedRequest();
+ if(_segments.size() < maxSegments) {
+ _requestGroup->getSegmentMan()->getSegment
+ (_segments, cuid, _fileEntry, maxSegments);
+ }
+ if(_segments.empty()) {
+ return prepareForRetry(0);
}
- _segments.push_back(segment);
- }
- if(_segments.empty()) {
- // TODO socket could be pooled here if pipelining is enabled...
- logger->info(MSG_NO_SEGMENT_AVAILABLE, cuid);
- return true;
}
}
return executeInternal();
@@ -266,11 +276,11 @@ bool AbstractCommand::prepareForRetry(time_t wait) {
}
if(!req.isNull()) {
_fileEntry->poolRequest(req);
- }
- if(!_segments.empty()) {
logger->debug("CUID#%d - Pooling request URI=%s",
cuid, req->getUrl().c_str());
- _requestGroup->getSegmentMan()->recognizeSegmentFor(_fileEntry);
+ if(!_requestGroup->getSegmentMan().isNull()) {
+ _requestGroup->getSegmentMan()->recognizeSegmentFor(_fileEntry);
+ }
}
Command* command = new CreateRequestCommand(cuid, _requestGroup, e);