]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blame - www/pages/torrent/client/piecebuffer.py
Change Color of Menuitem CeBIT.
[people/shoehn/ipfire.org.git] / www / pages / torrent / client / piecebuffer.py
CommitLineData
879aa787
MT
1# Written by John Hoffman
2# see LICENSE.txt for license information
3
4from array import array
5from threading import Lock
6# import inspect
7try:
8 True
9except:
10 True = 1
11 False = 0
12
13DEBUG = False
14
15class 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
61class 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()
86PieceBuffer = _pool.new