class Executor: def __init__(self): self.lock = Lock() self.cond = Condition(self.lock) self.wg = None # TODO sync.WaitGroup self.finished = False self.events = [] def Initialize(self): self.wg.Add(1) def Add(self, event): self.lock.Lock() # TODO defer self.lock.Unlock() self.events = append(self.events, event) self.cond.Signal() def Stop(self): self.lock.Lock() if not self.finished: # TODO defer self.wg.Wait() pass # TODO defer self.lock.Unlock() self.finished = true self.cond.Broadcast() def Dispatch(self): self.lock.Lock() # TODO defer self.lock.Unlock() # TODO defer self.wg.Done() while not self.finished: if len(self.events) == 0: self.cond.Wait() else: event = self.events[0] self.events = self.events[1:] self.lock.Unlock() event() self.lock.Lock()