Skip to content
Snippets Groups Projects
Commit fb718dec authored by Anael Beutot's avatar Anael Beutot
Browse files

Fix event handling for our own libvirt event loop.

Was ignoring event 0 which is used to stop "polling" events.
Was using mapping which couldn't work with multiple events.
parent 84cd62db
No related branches found
No related tags found
No related merge requests found
......@@ -54,27 +54,40 @@ class LoopHandler(object):
"""
def __init__(self, loop, handle, fd, events, cb, opaque):
# events conversion
self.events_map = {
pyev.EV_READ: libvirt.VIR_EVENT_HANDLE_READABLE,
pyev.EV_WRITE: libvirt.VIR_EVENT_HANDLE_WRITABLE,
}
self.revents_map = {
libvirt.VIR_EVENT_HANDLE_READABLE: pyev.EV_READ,
libvirt.VIR_EVENT_HANDLE_WRITABLE: pyev.EV_WRITE,
}
self.handle = handle
self.fd = fd
self._events = self.revents_map[events]
self._events = self.virt_to_ev(events)
self._cb = cb
self.opaque = opaque
self.watcher = loop.io(self.fd, self._events, self.ev_cb)
def ev_to_virt(self, events):
"""Convert libev events into libvirt one."""
result = 0
if events & pyev.EV_READ:
result |= libvirt.VIR_EVENT_HANDLE_READABLE
if events & pyev.EV_WRITE:
result |= libvirt.VIR_EVENT_HANDLE_WRITABLE
return result
def virt_to_ev(self, events):
"""Convert libvirt event to libev one."""
result = 0
if events & (libvirt.VIR_EVENT_HANDLE_READABLE |
libvirt.VIR_EVENT_HANDLE_ERROR |
libvirt.VIR_EVENT_HANDLE_HANGUP):
result |= pyev.EV_READ
if events & libvirt.VIR_EVENT_HANDLE_WRITABLE:
result |= pyev.EV_WRITE
return result
def _set(self):
self.watcher.stop()
self.watcher.set(self.fd, self._events)
self.watcher.start()
if self._events != 0:
self.watcher.set(self.fd, self._events)
self.watcher.start()
@property
def events(self):
......@@ -82,7 +95,7 @@ class LoopHandler(object):
@events.setter
def events(self, events):
self._events = self.revents_map[events]
self._events = self.virt_to_ev(events)
self._set()
def start(self):
......@@ -93,7 +106,7 @@ class LoopHandler(object):
def ev_cb(self, watcher, revents):
# convert events
events = self.events_map[revents]
events = self.ev_to_virt(revents)
self._cb(self.handle, self.watcher.fd, events, self.opaque[0],
self.opaque[1])
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment