mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-12-28 08:59:37 -05:00
Merge pull request #1045 from csoler/v0.6-FT
adding pending transfers 100 at a time instead of 1 at a time when lo…
This commit is contained in:
commit
58ccf0bef4
@ -826,62 +826,63 @@ bool ftController::isActiveAndNoPending()
|
|||||||
|
|
||||||
bool ftController::handleAPendingRequest()
|
bool ftController::handleAPendingRequest()
|
||||||
{
|
{
|
||||||
ftPendingRequest req;
|
uint32_t nb_requests_handled = 0 ;
|
||||||
{
|
static const uint32_t MAX_SIMULTANEOUS_PENDING_REQUESTS = 100 ;
|
||||||
RsStackMutex stack(ctrlMutex); /******* LOCKED ********/
|
|
||||||
|
|
||||||
if (mPendingRequests.size() < 1)
|
while(!mPendingRequests.empty() && nb_requests_handled++ < MAX_SIMULTANEOUS_PENDING_REQUESTS)
|
||||||
|
{
|
||||||
|
ftPendingRequest req;
|
||||||
{
|
{
|
||||||
return false;
|
RsStackMutex stack(ctrlMutex); /******* LOCKED ********/
|
||||||
|
|
||||||
|
req = mPendingRequests.front();
|
||||||
|
mPendingRequests.pop_front();
|
||||||
}
|
}
|
||||||
req = mPendingRequests.front();
|
|
||||||
mPendingRequests.pop_front();
|
|
||||||
}
|
|
||||||
#ifdef CONTROL_DEBUG
|
#ifdef CONTROL_DEBUG
|
||||||
std::cerr << "Requesting pending hash " << req.mHash << std::endl ;
|
std::cerr << "Requesting pending hash " << req.mHash << std::endl ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
FileRequest(req.mName, req.mHash, req.mSize, req.mDest, TransferRequestFlags(req.mFlags), req.mSrcIds, req.mState);
|
FileRequest(req.mName, req.mHash, req.mSize, req.mDest, TransferRequestFlags(req.mFlags), req.mSrcIds, req.mState);
|
||||||
|
|
||||||
{
|
|
||||||
// See whether there is a pendign chunk map recorded for this hash.
|
|
||||||
//
|
|
||||||
RsStackMutex stack(ctrlMutex); /******* LOCKED ********/
|
|
||||||
|
|
||||||
std::map<RsFileHash,RsFileTransfer*>::iterator it(mPendingChunkMaps.find(req.mHash)) ;
|
|
||||||
|
|
||||||
if(it != mPendingChunkMaps.end())
|
|
||||||
{
|
{
|
||||||
RsFileTransfer *rsft = it->second ;
|
// See whether there is a pendign chunk map recorded for this hash.
|
||||||
std::map<RsFileHash, ftFileControl*>::iterator fit = mDownloads.find(rsft->file.hash);
|
//
|
||||||
|
RsStackMutex stack(ctrlMutex); /******* LOCKED ********/
|
||||||
|
|
||||||
if((fit==mDownloads.end() || (fit->second)->mCreator == NULL))
|
std::map<RsFileHash,RsFileTransfer*>::iterator it(mPendingChunkMaps.find(req.mHash)) ;
|
||||||
|
|
||||||
|
if(it != mPendingChunkMaps.end())
|
||||||
{
|
{
|
||||||
// This should never happen, because the last call to FileRequest must have created the fileCreator!!
|
RsFileTransfer *rsft = it->second ;
|
||||||
//
|
std::map<RsFileHash, ftFileControl*>::iterator fit = mDownloads.find(rsft->file.hash);
|
||||||
std::cerr << "ftController::loadList(): Error: could not find hash " << rsft->file.hash << " in mDownloads list !" << std::endl ;
|
|
||||||
|
if((fit==mDownloads.end() || (fit->second)->mCreator == NULL))
|
||||||
|
{
|
||||||
|
// This should never happen, because the last call to FileRequest must have created the fileCreator!!
|
||||||
|
//
|
||||||
|
std::cerr << "ftController::loadList(): Error: could not find hash " << rsft->file.hash << " in mDownloads list !" << std::endl ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#ifdef CONTROL_DEBUG
|
||||||
|
std::cerr << "Hash " << req.mHash << " is in downloads" << std::endl ;
|
||||||
|
std::cerr << " setting chunk strategy to " << rsft->chunk_strategy << std::endl;
|
||||||
|
#endif
|
||||||
|
(fit->second)->mCreator->setAvailabilityMap(rsft->compressed_chunk_map) ;
|
||||||
|
(fit->second)->mCreator->setChunkStrategy((FileChunksInfo::ChunkStrategy)(rsft->chunk_strategy)) ;
|
||||||
|
(fit->second)->mState=rsft->state;
|
||||||
|
}
|
||||||
|
|
||||||
|
delete rsft ;
|
||||||
|
mPendingChunkMaps.erase(it) ;
|
||||||
}
|
}
|
||||||
|
#ifdef CONTROL_DEBUG
|
||||||
else
|
else
|
||||||
{
|
std::cerr << "No pending chunkmap for hash " << req.mHash << std::endl ;
|
||||||
#ifdef CONTROL_DEBUG
|
|
||||||
std::cerr << "Hash " << req.mHash << " is in downloads" << std::endl ;
|
|
||||||
std::cerr << " setting chunk strategy to " << rsft->chunk_strategy << std::endl;
|
|
||||||
#endif
|
#endif
|
||||||
(fit->second)->mCreator->setAvailabilityMap(rsft->compressed_chunk_map) ;
|
|
||||||
(fit->second)->mCreator->setChunkStrategy((FileChunksInfo::ChunkStrategy)(rsft->chunk_strategy)) ;
|
|
||||||
(fit->second)->mState=rsft->state;
|
|
||||||
}
|
|
||||||
|
|
||||||
delete rsft ;
|
|
||||||
mPendingChunkMaps.erase(it) ;
|
|
||||||
}
|
}
|
||||||
#ifdef CONTROL_DEBUG
|
|
||||||
else
|
|
||||||
std::cerr << "No pending chunkmap for hash " << req.mHash << std::endl ;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
return !mPendingRequests.empty();
|
||||||
return true ;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ftController::alreadyHaveFile(const RsFileHash& hash, FileInfo &info)
|
bool ftController::alreadyHaveFile(const RsFileHash& hash, FileInfo &info)
|
||||||
|
Loading…
Reference in New Issue
Block a user