summaryrefslogtreecommitdiffstats
path: root/BitTorrent/RateMeasure.py
diff options
context:
space:
mode:
Diffstat (limited to 'BitTorrent/RateMeasure.py')
-rw-r--r--BitTorrent/RateMeasure.py63
1 files changed, 63 insertions, 0 deletions
diff --git a/BitTorrent/RateMeasure.py b/BitTorrent/RateMeasure.py
new file mode 100644
index 0000000..b609330
--- /dev/null
+++ b/BitTorrent/RateMeasure.py
@@ -0,0 +1,63 @@
+# The contents of this file are subject to the BitTorrent Open Source License
+# Version 1.1 (the License). You may not copy or use this file, in either
+# source code or executable form, except in compliance with the License. You
+# may obtain a copy of the License at http://www.bittorrent.com/license/.
+#
+# Software distributed under the License is distributed on an AS IS basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+
+# Written by Bram Cohen
+
+from BitTorrent.platform import bttime
+
+
+class RateMeasure(object):
+
+ def __init__(self, left):
+ self.start = None
+ self.last = None
+ self.rate = 0
+ self.remaining = None
+ self.left = left
+ self.broke = False
+ self.got_anything = False
+
+ def data_came_in(self, amount):
+ if not self.got_anything:
+ self.got_anything = True
+ self.start = bttime() - 2
+ self.last = self.start
+ self.left -= amount
+ return
+ self.update(bttime(), amount)
+
+ def data_rejected(self, amount):
+ self.left += amount
+
+ def get_time_left(self):
+ if not self.got_anything:
+ return None
+ t = bttime()
+ if t - self.last > 15:
+ self.update(t, 0)
+ return self.remaining
+
+ def get_size_left(self):
+ return self.left
+
+ def update(self, t, amount):
+ self.left -= amount
+ try:
+ self.rate = ((self.rate * (self.last - self.start)) + amount) / (t - self.start)
+ self.last = t
+ self.remaining = self.left / self.rate
+ if self.start < self.last - self.remaining:
+ self.start = self.last - self.remaining
+ except ZeroDivisionError:
+ self.remaining = None
+ if self.broke and self.last - self.start < 20:
+ self.start = self.last - 20
+ if self.last - self.start > 20:
+ self.broke = True