| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- # Written by John Hoffman
- # see LICENSE.txt for license information
- from array import array
- from threading import Lock
- # import inspect
- try:
- True
- except:
- True = 1
- False = 0
-
- DEBUG = False
- class SingleBuffer:
- def __init__(self, pool):
- self.pool = pool
- self.buf = array('c')
- def init(self):
- if DEBUG:
- print self.count
- '''
- for x in xrange(6,1,-1):
- try:
- f = inspect.currentframe(x).f_code
- print (f.co_filename,f.co_firstlineno,f.co_name)
- del f
- except:
- pass
- print ''
- '''
- self.length = 0
- def append(self, s):
- l = self.length+len(s)
- self.buf[self.length:l] = array('c',s)
- self.length = l
- def __len__(self):
- return self.length
- def __getslice__(self, a, b):
- if b > self.length:
- b = self.length
- if b < 0:
- b += self.length
- if a == 0 and b == self.length and len(self.buf) == b:
- return self.buf # optimization
- return self.buf[a:b]
- def getarray(self):
- return self.buf[:self.length]
- def release(self):
- if DEBUG:
- print -self.count
- self.pool.release(self)
- class BufferPool:
- def __init__(self):
- self.pool = []
- self.lock = Lock()
- if DEBUG:
- self.count = 0
- def new(self):
- self.lock.acquire()
- if self.pool:
- x = self.pool.pop()
- else:
- x = SingleBuffer(self)
- if DEBUG:
- self.count += 1
- x.count = self.count
- x.init()
- self.lock.release()
- return x
- def release(self, x):
- self.pool.append(x)
- _pool = BufferPool()
- PieceBuffer = _pool.new
|