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/AbstractCommand.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/AbstractCommand.cc')
| -rw-r--r-- | src/AbstractCommand.cc | 38 |
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); |
