[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: extragear/network/ktorrent
From: Joris Guisson <joris.guisson () gmail ! com>
Date: 2005-09-16 19:05:49
Message-ID: 1126897549.715785.30446.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 461185 by guisson:
Changes :
- Fixed Bug 112688
- DownloadCap works a little bit better
M +2 -2 debugtools/Makefile.am
M +1 -1 ktorrent.kdevelop
M +28 -38 libtorrent/downloadcap.cpp
M +2 -4 libtorrent/downloadcap.h
M +3 -2 libtorrent/peerdownloader.cpp
M +5 -0 libtorrent/peerdownloader.h
M +8 -1 libtorrent/peermanager.cpp
M +3 -5 libtorrent/torrentcontrol.cpp
--- trunk/extragear/network/ktorrent/debugtools/Makefile.am #461184:461185
@@ -3,5 +3,5 @@
noinst_PROGRAMS = kttorinfo
kttorinfo_SOURCES = main.cpp
-kttorinfo_LDADD = $(top_builddir)/ktorrent/libtorrent/libtorrent.la \
- $(top_builddir)/ktorrent/libutil/libutil.la $(LIB_KIO) $(LIB_KFILE)
+kttorinfo_LDADD = $(top_builddir)/libtorrent/libtorrent.la \
+ $(top_builddir)/libutil/libutil.la $(LIB_KIO) $(LIB_KFILE)
--- trunk/extragear/network/ktorrent/ktorrent.kdevelop #461184:461185
@@ -34,7 +34,7 @@
<envvars/>
<runarguments>
<ktorrent/>
- <kttorinfo/>
+ <kttorinfo></kttorinfo>
</runarguments>
</run>
<make>
--- trunk/extragear/network/ktorrent/libtorrent/downloadcap.cpp #461184:461185
@@ -42,10 +42,11 @@
max_bytes_per_sec = max;
if (max_bytes_per_sec == 0)
{
- QPtrList<PeerDownloader>::iterator i = pdowners.begin();
+ std::list<PeerDownloader*>::iterator i = pdowners.begin();
while (i != pdowners.end())
{
PeerDownloader* pd = *i;
+ pd->setBlocked(false);
pd->setRequestInterval(0);
i++;
}
@@ -54,10 +55,6 @@
void DownloadCap::capPD(PeerDownloader* pd,Uint32 cap)
{
- // each piece is MAX_PIECE_LEN large
- // so the interval is (MAX_PIECE_LEN / max_speed_per_pd)
- // The * 1000 is to convert it to milliseconds
- int rti = (int)floor((MAX_PIECE_LEN / cap) * 1000.0f);
int rinterval = (int)pd->getRequestInterval();
int diff = pd->getDownloadRate() - cap;
@@ -77,59 +74,52 @@
if (rinterval < 0)
rinterval = 0;
pd->setRequestInterval(rinterval);
- // pd->setRequestInterval(rti);
+ pd->setBlocked(false);
}
- int DownloadCap::numActiveDownloaders()
+ struct PeerDownloadRateCmp
{
- int num_active=0;
- QPtrList<PeerDownloader>::iterator i = pdowners.begin();
- while (i != pdowners.end())
+ bool operator () (PeerDownloader* a,PeerDownloader* b)
{
- PeerDownloader* pd = *i;
- if (pd->getNumGrabbed() != 0)
- num_active++;
- i++;
+ return a->getPeer()->getDownloadRate() > b->getPeer()->getDownloadRate();
}
- return num_active;
- }
+ };
- void DownloadCap::capAll(float max_speed_per_pd)
- {
- // set everybody to max_speed_per_pd speed
- QPtrList<PeerDownloader>::iterator i = pdowners.begin();
- while (i != pdowners.end())
- {
- PeerDownloader* pd = *i;
- capPD(pd,(int)floor(max_speed_per_pd));
- i++;
- }
- }
-
-
void DownloadCap::update()
{
if (max_bytes_per_sec == 0)
return;
- int num_active = numActiveDownloaders();
+ int num = pdowners.size() < 4 ? pdowners.size() : 4;
// the normal speed a PeerDownloader is allowed to do
- float max_speed_per_pd = max_bytes_per_sec / (float)num_active;
- // cap everybody to max_speed_per_pd
- capAll(max_speed_per_pd);
+ float max_speed_per_pd = max_bytes_per_sec / (float)num;
+
+ // sort by download speed
+ pdowners.sort(PeerDownloadRateCmp());
+
+ std::list<PeerDownloader*>::iterator i = pdowners.begin();
+ int j = 0;
+ while (i != pdowners.end() && j < 4)
+ {
+ // cap the 4 first at max_speed_per_pd
+ // and the other at 30 seconds
+ PeerDownloader* pd = *i;
+ if (j < 4)
+ capPD(pd,(Uint32)floor(max_speed_per_pd));
+ else
+ pd->setBlocked(true);
+ i++; j++;
+ }
}
void DownloadCap::addPeerDonwloader(PeerDownloader* pd)
{
- pdowners.append(pd);
+ pdowners.push_back(pd);
if (max_bytes_per_sec == 0)
pd->setRequestInterval(0);
else
- // initially set to 1000 to not get high download peaks
- // after a tracker request was recieved
- // and we start connecting to a lot of peers
- pd->setRequestInterval(1000);
+ pd->setBlocked(true);
}
void DownloadCap::removePeerDownloader(PeerDownloader* pd)
--- trunk/extragear/network/ktorrent/libtorrent/downloadcap.h #461184:461185
@@ -20,7 +20,7 @@
#ifndef BTDOWNLOADCAP_H
#define BTDOWNLOADCAP_H
-#include <qptrlist.h>
+#include <list>
#include <libutil/timer.h>
#include "globals.h"
@@ -36,7 +36,7 @@
static DownloadCap self;
Uint32 max_bytes_per_sec;
- QPtrList<PeerDownloader> pdowners;
+ std::list<PeerDownloader*> pdowners;
DownloadCap();
public:
@@ -57,8 +57,6 @@
static DownloadCap & instance() {return self;}
private:
void capPD(PeerDownloader* pd,Uint32 cap);
- int numActiveDownloaders();
- void capAll(float max_speed_per_pd);
};
}
--- trunk/extragear/network/ktorrent/libtorrent/peerdownloader.cpp #461184:461185
@@ -35,6 +35,7 @@
last_req_time = 0;
req_time_interval = 0;
+ blocked = false;
DownloadCap::instance().addPeerDonwloader(this);
}
@@ -84,7 +85,7 @@
return;
Uint32 now = bt::GetCurrentTime();
- if (now - last_req_time >= req_time_interval)
+ if (now - last_req_time >= req_time_interval && !blocked)
{
reqs.append(req);
peer->getPacketWriter().sendRequest(req);
@@ -161,7 +162,7 @@
void PeerDownloader::downloadUnsent()
{
- if (!peer)
+ if (!peer || blocked)
return;
QValueList<Request>::iterator i = unsent_reqs.begin();
--- trunk/extragear/network/ktorrent/libtorrent/peerdownloader.h #461184:461185
@@ -103,6 +103,10 @@
/// Retrannsmit all requests.
void retransmitRequests();
+
+ /// Block the PeerDownloader, blocked downloaders
+ /// do not download anything
+ void setBlocked(bool b) {blocked = b;}
public slots:
/**
* Send a Request. Note that the DownloadCap
@@ -137,6 +141,7 @@
private:
Peer* peer;
Uint32 last_req_time,req_time_interval;
+ bool blocked;
QValueList<Request> reqs;
QValueList<Request> unsent_reqs;
int grabbed;
--- trunk/extragear/network/ktorrent/libtorrent/peermanager.cpp #461184:461185
@@ -132,8 +132,15 @@
{
Peer* p = *i;
if ( p->isSeeder() )
+ {
p->kill();
- i++;
+ i = peer_list.erase(i);
+ killed.append(p);
+ peer_map.erase(p->getID());
+ peerKilled(p);
+ }
+ else
+ i++;
}
}
--- trunk/extragear/network/ktorrent/libtorrent/torrentcontrol.cpp #461184:461185
@@ -108,10 +108,7 @@
finished(this);
pman->killSeeders();
QTime now = QTime::currentTime();
- // Out() << running_time_dl << endl;
running_time_dl += time_started_dl.secsTo(now);
- // Out() << "Finished (total time : " << running_time_dl << " secs)" << endl;
- // Out() << time_started_dl.toString("mm:ss") << " " << now.toString("mm:ss") << endl;
}
else if (!completed && comp)
{
@@ -165,6 +162,7 @@
// make sure the downloadcap gets obeyed
DownloadCap::instance().update();
+
}
catch (Error & e)
{
@@ -372,7 +370,7 @@
{
if (tor->getNumTrackerURLs() > 1)
{
- trackerstatus = i18n("Unreachable, trying backup");
+ trackerstatus = i18n("Unreachable");
updateTracker(trackerevent,false);
}
updateStatusMsg();
@@ -381,7 +379,7 @@
}
else if (trackerevent != "stopped")
{
- trackerstatus = i18n("Unreachable, trying backup");
+ trackerstatus = i18n("Unreachable");
updateTracker(trackerevent,false);
}
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic