diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-07-20 07:55:10 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-07-20 07:55:10 +0000 |
| commit | ec395b6a9cf6bb233c07c6a3584f1dbe93f2d647 (patch) | |
| tree | aeb96398ba7fcfc97d7c41d31b3bae1b3c5db447 /src | |
| parent | 52979168f34cda620d1347aa2356f943a775ac37 (diff) | |
2008-07-20 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Now SegmentMan::findSlowerSegmentEntry() picks up the segment
for which
the transfer has not yet started.
Rewritten SegmentMan::registerPeerStat() and
SegmentMan::getPeerStat().
* src/SegmentMan.cc
* src/SegmentMan.h
* test/SegmentManTest.cc
Diffstat (limited to 'src')
| -rw-r--r-- | src/SegmentMan.cc | 71 | ||||
| -rw-r--r-- | src/SegmentMan.h | 9 |
2 files changed, 53 insertions, 27 deletions
diff --git a/src/SegmentMan.cc b/src/SegmentMan.cc index 0fbc4cf5..a2f4442b 100644 --- a/src/SegmentMan.cc +++ b/src/SegmentMan.cc @@ -123,25 +123,36 @@ SegmentHandle SegmentMan::checkoutSegment(int32_t cuid, return segment; } -SegmentEntryHandle SegmentMan::findSlowerSegmentEntry(const PeerStatHandle& peerStat) const { +SegmentEntryHandle SegmentMan::findSlowerSegmentEntry +(const PeerStatHandle& peerStat) +{ unsigned int speed = peerStat->getAvgDownloadSpeed()*0.8; SegmentEntryHandle slowSegmentEntry; - for(SegmentEntries::const_iterator itr = usedSegmentEntries.begin(); - itr != usedSegmentEntries.end(); ++itr) { - const SegmentEntryHandle& segmentEntry = *itr; + int startupIdleTime = _option->getAsInt(PREF_STARTUP_IDLE_TIME); + for(std::deque<SharedHandle<SegmentEntry> >::const_iterator itr = + usedSegmentEntries.begin(); itr != usedSegmentEntries.end(); ++itr) { + const SharedHandle<SegmentEntry>& segmentEntry = *itr; if(segmentEntry->cuid == 0) { continue; } - PeerStatHandle p = getPeerStat(segmentEntry->cuid); - if(!p.get() || p->getCuid() == peerStat->getCuid() || - p->getStatus() != PeerStat::ACTIVE || - !p->getDownloadStartTime().elapsed(_option->getAsInt(PREF_STARTUP_IDLE_TIME))) { - continue; - } - unsigned int pSpeed = p->calculateDownloadSpeed(); - if(pSpeed < speed) { - speed = pSpeed; + SharedHandle<PeerStat> p = getPeerStat(segmentEntry->cuid); + if(p.isNull()) { + // "p is null" means that it hasn't used DownloadCommand yet, i.e. waiting + // response from HTTP server after sending HTTP request. + p.reset(new PeerStat(segmentEntry->cuid)); + registerPeerStat(p); slowSegmentEntry = segmentEntry; + } else { + if(p->getCuid() == peerStat->getCuid() || + (p->getStatus() == PeerStat::ACTIVE && + !p->getDownloadStartTime().elapsed(startupIdleTime))) { + continue; + } + unsigned int pSpeed = p->calculateDownloadSpeed(); + if(pSpeed < speed) { + speed = pSpeed; + slowSegmentEntry = segmentEntry; + } } } return slowSegmentEntry; @@ -241,22 +252,36 @@ uint64_t SegmentMan::getDownloadLength() const { } } -void SegmentMan::registerPeerStat(const PeerStatHandle& peerStat) { - PeerStatHandle temp = getPeerStat(peerStat->getCuid()); - if(!temp.get()) { - peerStats.push_back(peerStat); +class FindPeerStat { +public: + bool operator()(const SharedHandle<PeerStat>& peerStat, int32_t cuid) const + { + return peerStat->getCuid() < cuid; + } +}; + +bool SegmentMan::registerPeerStat(const SharedHandle<PeerStat>& peerStat) +{ + std::deque<SharedHandle<PeerStat> >::iterator i = + std::lower_bound(peerStats.begin(), peerStats.end(),peerStat->getCuid(), + FindPeerStat()); + if(i == peerStats.end() || (*i)->getCuid() != peerStat->getCuid()) { + peerStats.insert(i, peerStat); + return true ; + } else { + return false; } } PeerStatHandle SegmentMan::getPeerStat(int32_t cuid) const { - for(std::deque<SharedHandle<PeerStat> >::const_iterator itr = peerStats.begin(); itr != peerStats.end(); ++itr) { - const PeerStatHandle& peerStat = *itr; - if(peerStat->getCuid() == cuid) { - return peerStat; - } + std::deque<SharedHandle<PeerStat> >::const_iterator i = + std::lower_bound(peerStats.begin(), peerStats.end(), cuid, FindPeerStat()); + if(i != peerStats.end() && (*i)->getCuid() == cuid) { + return *i; + } else { + return SharedHandle<PeerStat>(); } - return SharedHandle<PeerStat>(); } unsigned int SegmentMan::calculateDownloadSpeed() const { diff --git a/src/SegmentMan.h b/src/SegmentMan.h index fcc9c743..8d8be720 100644 --- a/src/SegmentMan.h +++ b/src/SegmentMan.h @@ -82,7 +82,8 @@ private: SharedHandle<Segment> checkoutSegment(int32_t cuid, const SharedHandle<Piece>& piece); - SegmentEntryHandle findSlowerSegmentEntry(const SharedHandle<PeerStat>& peerStat) const; + SharedHandle<SegmentEntry> findSlowerSegmentEntry + (const SharedHandle<PeerStat>& peerStat); public: SegmentMan(const Option* option, const SharedHandle<DownloadContext>& downloadContext, @@ -159,10 +160,10 @@ public: uint64_t getDownloadLength() const; /** - * Registers given peerStat if it has not been registerd. - * Otherwise does nothing. + * Registers given peerStat if it has not been registerd and returns true. + * Otherwise does nothing and returns false. */ - void registerPeerStat(const SharedHandle<PeerStat>& peerStat); + bool registerPeerStat(const SharedHandle<PeerStat>& peerStat); /** * Returns peerStat whose cuid is given cuid. If it is not found, returns |
