Lines 73-80
class virEventLoopPure:
|
Link Here
|
---|
|
73 |
self.cb(self.handle, |
73 |
self.cb(self.handle, |
74 |
self.fd, |
74 |
self.fd, |
75 |
events, |
75 |
events, |
76 |
self.opaque[0], |
76 |
self.opaque) |
77 |
self.opaque[1]) |
|
|
78 |
|
77 |
|
79 |
class virEventLoopPureTimer: |
78 |
class virEventLoopPureTimer: |
80 |
"""This class contains the data we need to track for a single periodic timer.""" |
79 |
"""This class contains the data we need to track for a single periodic timer.""" |
Lines 102-109
class virEventLoopPure:
|
Link Here
|
---|
|
102 |
|
101 |
|
103 |
def dispatch(self): |
102 |
def dispatch(self): |
104 |
self.cb(self.timer, |
103 |
self.cb(self.timer, |
105 |
self.opaque[0], |
104 |
self.opaque) |
106 |
self.opaque[1]) |
|
|
107 |
|
105 |
|
108 |
|
106 |
|
109 |
def __init__(self, debug=False): |
107 |
def __init__(self, debug=False): |
Lines 192-245
class virEventLoopPure:
|
Link Here
|
---|
|
192 |
these pointless repeated tiny sleeps.""" |
190 |
these pointless repeated tiny sleeps.""" |
193 |
sleep = -1 |
191 |
sleep = -1 |
194 |
self.runningPoll = True |
192 |
self.runningPoll = True |
195 |
next = self.next_timeout() |
193 |
try: |
196 |
self.debug("Next timeout due at %d" % next) |
194 |
next = self.next_timeout() |
197 |
if next > 0: |
195 |
self.debug("Next timeout due at %d" % next) |
198 |
now = int(time.time() * 1000) |
196 |
if next > 0: |
199 |
if now >= next: |
197 |
now = int(time.time() * 1000) |
200 |
sleep = 0 |
198 |
if now >= next: |
201 |
else: |
199 |
sleep = 0 |
202 |
sleep = (next - now) / 1000.0 |
200 |
else: |
203 |
|
201 |
sleep = (next - now) / 1000.0 |
204 |
self.debug("Poll with a sleep of %d" % sleep) |
202 |
|
205 |
while True: |
203 |
self.debug("Poll with a sleep of %d" % sleep) |
206 |
try: |
204 |
events = self.poll.poll(sleep) |
207 |
events = self.poll.poll(sleep) |
205 |
|
208 |
break |
206 |
# Dispatch any file handle events that occurred |
209 |
except select.error, (err, msg): |
207 |
for (fd, revents) in events: |
210 |
if err != errno.EINTR: |
208 |
# See if the events was from the self-pipe |
211 |
raise |
209 |
# telling us to wakup. if so, then discard |
212 |
|
210 |
# the data just continue |
213 |
# Dispatch any file handle events that occurred |
211 |
if fd == self.pipetrick[0]: |
214 |
for (fd, revents) in events: |
212 |
self.pendingWakeup = False |
215 |
# See if the events was from the self-pipe |
213 |
data = os.read(fd, 1) |
216 |
# telling us to wakup. if so, then discard |
214 |
continue |
217 |
# the data just continue |
215 |
|
218 |
if fd == self.pipetrick[0]: |
216 |
h = self.get_handle_by_fd(fd) |
219 |
self.pendingWakeup = False |
217 |
if h: |
220 |
data = os.read(fd, 1) |
218 |
self.debug("Dispatch fd %d handle %d events %d" % (fd, h.get_id(), revents)) |
221 |
continue |
219 |
h.dispatch(self.events_from_poll(revents)) |
222 |
|
|
|
223 |
h = self.get_handle_by_fd(fd) |
224 |
if h: |
225 |
self.debug("Dispatch fd %d handle %d events %d" % (fd, h.get_id(), revents)) |
226 |
h.dispatch(self.events_from_poll(revents)) |
227 |
|
228 |
now = int(time.time() * 1000) |
229 |
for t in self.timers: |
230 |
interval = t.get_interval() |
231 |
if interval < 0: |
232 |
continue |
233 |
|
234 |
want = t.get_last_fired() + interval |
235 |
# Deduct 20ms, since schedular timeslice |
236 |
# means we could be ever so slightly early |
237 |
if now >= (want-20): |
238 |
self.debug("Dispatch timer %d now %s want %s" % (t.get_id(), str(now), str(want))) |
239 |
t.set_last_fired(now) |
240 |
t.dispatch() |
241 |
|
220 |
|
242 |
self.runningPoll = False |
221 |
now = int(time.time() * 1000) |
|
|
222 |
for t in self.timers: |
223 |
interval = t.get_interval() |
224 |
if interval < 0: |
225 |
continue |
226 |
|
227 |
want = t.get_last_fired() + interval |
228 |
# Deduct 20ms, since scheduler timeslice |
229 |
# means we could be ever so slightly early |
230 |
if now >= (want-20): |
231 |
self.debug("Dispatch timer %d now %s want %s" % (t.get_id(), str(now), str(want))) |
232 |
t.set_last_fired(now) |
233 |
t.dispatch() |
234 |
|
235 |
except (os.error, select.error), e: |
236 |
if e.args[0] != errno.EINTR: |
237 |
raise |
238 |
finally: |
239 |
self.runningPoll = False |
243 |
|
240 |
|
244 |
def run_loop(self): |
241 |
def run_loop(self): |
245 |
"""Actually the event loop forever.""" |
242 |
"""Actually the event loop forever.""" |
Lines 305-311
class virEventLoopPure:
|
Link Here
|
---|
|
305 |
"""Change the periodic frequency of the timer.""" |
302 |
"""Change the periodic frequency of the timer.""" |
306 |
for h in self.timers: |
303 |
for h in self.timers: |
307 |
if h.get_id() == timerID: |
304 |
if h.get_id() == timerID: |
308 |
h.set_interval(interval); |
305 |
h.set_interval(interval) |
309 |
self.interrupt() |
306 |
self.interrupt() |
310 |
|
307 |
|
311 |
self.debug("Update timer %d interval %d" % (timerID, interval)) |
308 |
self.debug("Update timer %d interval %d" % (timerID, interval)) |
Lines 341-365
class virEventLoopPure:
|
Link Here
|
---|
|
341 |
if events & libvirt.VIR_EVENT_HANDLE_WRITABLE: |
338 |
if events & libvirt.VIR_EVENT_HANDLE_WRITABLE: |
342 |
ret |= select.POLLOUT |
339 |
ret |= select.POLLOUT |
343 |
if events & libvirt.VIR_EVENT_HANDLE_ERROR: |
340 |
if events & libvirt.VIR_EVENT_HANDLE_ERROR: |
344 |
ret |= select.POLLERR; |
341 |
ret |= select.POLLERR |
345 |
if events & libvirt.VIR_EVENT_HANDLE_HANGUP: |
342 |
if events & libvirt.VIR_EVENT_HANDLE_HANGUP: |
346 |
ret |= select.POLLHUP; |
343 |
ret |= select.POLLHUP |
347 |
return ret |
344 |
return ret |
348 |
|
345 |
|
349 |
def events_from_poll(self, events): |
346 |
def events_from_poll(self, events): |
350 |
"""Convert from poll() event constants, to libvirt events constants.""" |
347 |
"""Convert from poll() event constants, to libvirt events constants.""" |
351 |
ret = 0; |
348 |
ret = 0 |
352 |
if events & select.POLLIN: |
349 |
if events & select.POLLIN: |
353 |
ret |= libvirt.VIR_EVENT_HANDLE_READABLE; |
350 |
ret |= libvirt.VIR_EVENT_HANDLE_READABLE |
354 |
if events & select.POLLOUT: |
351 |
if events & select.POLLOUT: |
355 |
ret |= libvirt.VIR_EVENT_HANDLE_WRITABLE; |
352 |
ret |= libvirt.VIR_EVENT_HANDLE_WRITABLE |
356 |
if events & select.POLLNVAL: |
353 |
if events & select.POLLNVAL: |
357 |
ret |= libvirt.VIR_EVENT_HANDLE_ERROR; |
354 |
ret |= libvirt.VIR_EVENT_HANDLE_ERROR |
358 |
if events & select.POLLERR: |
355 |
if events & select.POLLERR: |
359 |
ret |= libvirt.VIR_EVENT_HANDLE_ERROR; |
356 |
ret |= libvirt.VIR_EVENT_HANDLE_ERROR |
360 |
if events & select.POLLHUP: |
357 |
if events & select.POLLHUP: |
361 |
ret |= libvirt.VIR_EVENT_HANDLE_HANGUP; |
358 |
ret |= libvirt.VIR_EVENT_HANDLE_HANGUP |
362 |
return ret; |
359 |
return ret |
363 |
|
360 |
|
364 |
|
361 |
|
365 |
########################################################################### |
362 |
########################################################################### |