Blame | Last modification | View Log | Download
# Written by John Hoffman# see LICENSE.txt for license informationfrom array import arrayfrom threading import Lock# import inspecttry:Trueexcept:True = 1False = 0DEBUG = Falseclass SingleBuffer:def __init__(self, pool):self.pool = poolself.buf = array('c')def init(self):if DEBUG:print self.count'''for x in xrange(6,1,-1):try:f = inspect.currentframe(x).f_codeprint (f.co_filename,f.co_firstlineno,f.co_name)del fexcept:passprint '''''self.length = 0def append(self, s):l = self.length+len(s)self.buf[self.length:l] = array('c',s)self.length = ldef __len__(self):return self.lengthdef __getslice__(self, a, b):if b > self.length:b = self.lengthif b < 0:b += self.lengthif a == 0 and b == self.length and len(self.buf) == b:return self.buf # optimizationreturn self.buf[a:b]def getarray(self):return self.buf[:self.length]def release(self):if DEBUG:print -self.countself.pool.release(self)class BufferPool:def __init__(self):self.pool = []self.lock = Lock()if DEBUG:self.count = 0def new(self):self.lock.acquire()if self.pool:x = self.pool.pop()else:x = SingleBuffer(self)if DEBUG:self.count += 1x.count = self.countx.init()self.lock.release()return xdef release(self, x):self.pool.append(x)_pool = BufferPool()PieceBuffer = _pool.new