]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - www/pages/torrent/client/piecebuffer.py
Change Color of Menuitem CeBIT.
[people/shoehn/ipfire.org.git] / www / pages / torrent / client / piecebuffer.py
1 # Written by John Hoffman
2 # see LICENSE.txt for license information
3
4 from array import array
5 from threading import Lock
6 # import inspect
7 try:
8 True
9 except:
10 True = 1
11 False = 0
12
13 DEBUG = False
14
15 class SingleBuffer:
16 def __init__(self, pool):
17 self.pool = pool
18 self.buf = array('c')
19
20 def init(self):
21 if DEBUG:
22 print self.count
23 '''
24 for x in xrange(6,1,-1):
25 try:
26 f = inspect.currentframe(x).f_code
27 print (f.co_filename,f.co_firstlineno,f.co_name)
28 del f
29 except:
30 pass
31 print ''
32 '''
33 self.length = 0
34
35 def append(self, s):
36 l = self.length+len(s)
37 self.buf[self.length:l] = array('c',s)
38 self.length = l
39
40 def __len__(self):
41 return self.length
42
43 def __getslice__(self, a, b):
44 if b > self.length:
45 b = self.length
46 if b < 0:
47 b += self.length
48 if a == 0 and b == self.length and len(self.buf) == b:
49 return self.buf # optimization
50 return self.buf[a:b]
51
52 def getarray(self):
53 return self.buf[:self.length]
54
55 def release(self):
56 if DEBUG:
57 print -self.count
58 self.pool.release(self)
59
60
61 class BufferPool:
62 def __init__(self):
63 self.pool = []
64 self.lock = Lock()
65 if DEBUG:
66 self.count = 0
67
68 def new(self):
69 self.lock.acquire()
70 if self.pool:
71 x = self.pool.pop()
72 else:
73 x = SingleBuffer(self)
74 if DEBUG:
75 self.count += 1
76 x.count = self.count
77 x.init()
78 self.lock.release()
79 return x
80
81 def release(self, x):
82 self.pool.append(x)
83
84
85 _pool = BufferPool()
86 PieceBuffer = _pool.new