mirror of https://github.com/aria2/aria2
Fixed assertion error if --retry-wait is used
In CreateRequestCommand, if Request object returned from getRequest() is still sleeping, CreateRequestCommand pools it back but still holds its reference. This makes assertion error in UnknownLengthPieceStroage::hasMissingUnusedPiece() from AbstractCommand::execute().pull/28/head
parent
d59300d582
commit
0bbda43385
|
@ -896,6 +896,11 @@ void AbstractCommand::setRequest(const SharedHandle<Request>& request)
|
|||
req_ = request;
|
||||
}
|
||||
|
||||
void AbstractCommand::resetRequest()
|
||||
{
|
||||
req_.reset();
|
||||
}
|
||||
|
||||
void AbstractCommand::setFileEntry(const SharedHandle<FileEntry>& fileEntry)
|
||||
{
|
||||
fileEntry_ = fileEntry;
|
||||
|
|
|
@ -110,6 +110,10 @@ protected:
|
|||
|
||||
void setRequest(const SharedHandle<Request>& request);
|
||||
|
||||
// Resets request_. This method is more efficient than
|
||||
// setRequest(SharedHandle<Request>());
|
||||
void resetRequest();
|
||||
|
||||
const SharedHandle<FileEntry>& getFileEntry() const
|
||||
{
|
||||
return fileEntry_;
|
||||
|
|
|
@ -101,6 +101,10 @@ bool CreateRequestCommand::executeInternal()
|
|||
} else if(getRequest()->getWakeTime() > global::wallclock()) {
|
||||
A2_LOG_DEBUG("This request object is still sleeping.");
|
||||
getFileEntry()->poolRequest(getRequest());
|
||||
// Reset request of this command. Without this, request is doubly
|
||||
// counted (1 for pooled and another one in this command) and
|
||||
// AbstractCommand::execute() will behave badly.
|
||||
resetRequest();
|
||||
getDownloadEngine()->addCommand(this);
|
||||
return false;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue