class MTCounter(MTValue): def __init__( self, val = 0 ): MTValue.__init__(self, 0) self._cond = Condition(self._mutex) self._val = 0 def next( self ): self._mutex.acquire() try: self._val += 1 self._cond.notifyAll() return self._val finally: self._mutex.release() def incr( self ): self._mutex.acquire() try: self._val += 1 self._cond.notifyAll() finally: self._mutex.release() # timeout in in sec, float def wait( self, count, timeOut = None ): self._mutex.acquire() try: while self._val < count: if not self._cond.wait(timeOut): return None # timed out return True finally: self._mutex.release()
class MTQueue: def __init__(self): self.queue = [] self.cond = Condition() def push(self, val): self.cond.acquire() try: self.queue.append(val) self.cond.notifyAll() finally: self.cond.release() def pop(self, timeOut=None): shutdown.check() self.cond.acquire() try: while len(self.queue) == 0: if not self.cond.wait(timeOut): raise XTimedOut('Timing out waiting on mt-queue') val = self.queue[0] self.queue = self.queue[1:] return val finally: self.cond.release() def empty(self): self.cond.acquire() try: return len(self.queue) == 0 finally: self.cond.release() def getAll(self): self.cond.acquire() try: list = self.queue self.queue = [] return list finally: self.cond.release() def size(self): self.cond.acquire() try: return len(self.queue) finally: self.cond.release() def clear(self): self.cond.acquire() try: self.queue = [] finally: self.cond.release()
class MTFlag(MTValue): def __init__( self, val = False, pred = bool ): MTValue.__init__(self, val) self._cond = Condition(self._mutex) self._pred = pred def set( self, val = True ): self._mutex.acquire() self._val = val if self._pred(val): self._cond.notifyAll() self._mutex.release() # timeout in in sec, float def wait( self, timeOut = None ): self._mutex.acquire() try: while not self._pred(self._val): if not self._cond.wait(timeOut): return None # timed out return self._val # it can be not boolean finally: self._mutex.release()