summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-07-20 07:55:10 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-07-20 07:55:10 +0000
commitec395b6a9cf6bb233c07c6a3584f1dbe93f2d647 (patch)
treeaeb96398ba7fcfc97d7c41d31b3bae1b3c5db447 /src
parent52979168f34cda620d1347aa2356f943a775ac37 (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.cc71
-rw-r--r--src/SegmentMan.h9
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