[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