]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blame - www/pages/torrent/client/RateMeasure.py
Change Color of Menuitem CeBIT.
[people/shoehn/ipfire.org.git] / www / pages / torrent / client / RateMeasure.py
CommitLineData
879aa787
MT
1# Written by Bram Cohen
2# see LICENSE.txt for license information
3
4from clock import clock
5try:
6 True
7except:
8 True = 1
9 False = 0
10
11FACTOR = 0.999
12
13class RateMeasure:
14 def __init__(self):
15 self.last = None
16 self.time = 1.0
17 self.got = 0.0
18 self.remaining = None
19 self.broke = False
20 self.got_anything = False
21 self.last_checked = None
22 self.rate = 0
23 self.lastten = False
24
25 def data_came_in(self, amount):
26 if not self.got_anything:
27 self.got_anything = True
28 self.last = clock()
29 return
30 self.update(amount)
31
32 def data_rejected(self, amount):
33 pass
34
35 def get_time_left(self, left):
36 t = clock()
37 if not self.got_anything:
38 return None
39 if t - self.last > 15:
40 self.update(0)
41 try:
42 remaining = left/self.rate
43 if not self.lastten and remaining <= 10:
44 self.lastten = True
45 if self.lastten:
46 return remaining
47 delta = max(remaining/20,2)
48 if self.remaining is None:
49 self.remaining = remaining
50 elif abs(self.remaining-remaining) > delta:
51 self.remaining = remaining
52 else:
53 self.remaining -= t - self.last_checked
54 except ZeroDivisionError:
55 self.remaining = None
56 if self.remaining is not None and self.remaining < 0.1:
57 self.remaining = 0.1
58 self.last_checked = t
59 return self.remaining
60
61 def update(self, amount):
62 t = clock()
63 t1 = int(t)
64 l1 = int(self.last)
65 for i in xrange(l1,t1):
66 self.time *= FACTOR
67 self.got *= FACTOR
68 self.got += amount
69 if t - self.last < 20:
70 self.time += t - self.last
71 self.last = t
72 try:
73 self.rate = self.got / self.time
74 except ZeroDivisionError:
75 pass