Blame | Last modification | View Log | Download
# 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