def __init__(self):
self.poll = select.poll()
self.pipetrick = os.pipe()
+ self.pendingWakeup = False
+ self.runningPoll = False
self.nextHandleID = 1
self.nextTimerID = 1
self.handles = []
# these pointless repeated tiny sleeps.
def run_once(self):
sleep = -1
+ self.runningPoll = True
next = self.next_timeout()
debug("Next timeout due at %d" % next)
if next > 0:
# telling us to wakup. if so, then discard
# the data just continue
if fd == self.pipetrick[0]:
+ self.pendingWakeup = False
data = os.read(fd, 1)
continue
t.set_last_fired(now)
t.dispatch()
+ self.runningPoll = False
+
# Actually the event loop forever
def run_loop(self):
self.run_once()
def interrupt(self):
- os.write(self.pipetrick[1], 'c')
+ if self.runningPoll and not self.pendingWakeup:
+ self.pendingWakeup = True
+ os.write(self.pipetrick[1], 'c')
# Registers a new file handle 'fd', monitoring for 'events' (libvirt