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
Loading
Loading
Loading
Loading
+28 −15
Original line number Diff line number Diff line
@@ -54,25 +54,38 @@ 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()
        if self._events != 0:
            self.watcher.set(self.fd, self._events)
            self.watcher.start()

@@ -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])