On Fri, Mar 17, 2017 at 02:35:53PM +0100, Wojtek Porczyk wrote: > This is usable only on python >= 3.4 (or 3.3 with out-of-tree asyncio), > however it should be harmless for anyone with older python versions. > > In simplest case, to have the callbacks queued on the default loop: > > >>> import libvirtaio > >>> libvirtaio.virEventRegisterAsyncIOImpl() > > The function is not present on non-compatible platforms. > > Signed-off-by: Wojtek Porczyk <woju@xxxxxxxxxxxxxxxxxxxxxx> > --- > libvirt-python.spec.in | 1 + > libvirtaio.py | 401 +++++++++++++++++++++++++++++++++++++++++++++++++ > sanitytest.py | 2 +- > setup.py | 12 ++ > 4 files changed, 415 insertions(+), 1 deletion(-) > create mode 100644 libvirtaio.py > + def _remove_handle(self, watch): > + '''Unregister a callback from a file handle. > + > + :param int watch: file descriptor watch to stop listening on > + :returns: None (see source for explanation) > + > + .. seealso:: > + https://libvirt.org/html/libvirt-libvirt-event.html#virEventRemoveHandleFunc > + ''' > + self.log.debug('remove_handle(watch=%d)', watch) > + callback = self.callbacks.pop(watch) > + assert callback is self.descriptors.remove_handle(watch) > + callback.close() This code contains a bug - self.descriptors needs to be indexed by 'fd'. We also need to delete the hash entry when the callbacks are empty. IOW, I think the code needs to be: callback = self.callbacks.pop(watch) fd = callback.descriptor.fd assert callback is self.descriptors[fd].remove_handle(watch) if len(self.descriptors[fd].callbacks) == 0: del self.descriptors[fd] callback.close() I'm going to send a patch series containing this fix & some other changes / fixes. Would appreciate if you can confirm my updated code still works from your pov. Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://entangle-photo.org -o- http://search.cpan.org/~danberr/ :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list