summaryrefslogtreecommitdiffstats
path: root/libvirt-override.py
diff options
context:
space:
mode:
authorCole Robinson <crobinso@redhat.com>2011-06-15 20:02:27 -0400
committerCole Robinson <crobinso@redhat.com>2011-06-21 10:08:48 -0400
commit12d8d49559c2c4616357dd1d99cd7bcd39646033 (patch)
tree4131ea598e3db08a0782f6b71587bd090d6f69e8 /libvirt-override.py
parente46bf585a6ff8f535c0bccb1667fafd0aebd1904 (diff)
downloadlibvirt-python-split-12d8d49559c2c4616357dd1d99cd7bcd39646033.zip
libvirt-python-split-12d8d49559c2c4616357dd1d99cd7bcd39646033.tar.gz
libvirt-python-split-12d8d49559c2c4616357dd1d99cd7bcd39646033.tar.xz
python: events: Fix C->Python handle callback prototype
If registering our own event loop implementation written in python, any handles or timeouts callbacks registered by libvirt C code must be wrapped in a python function. There is some argument trickery that makes this all work, by wrapping the user passed opaque value in a tuple, along with the callback function. Problem is, the current setup requires the user's event loop to know about this trickery, rather than just treating the opaque value as truly opaque. Fix this in a backwards compatible manner, and adjust the example python event loop to do things the proper way.
Diffstat (limited to 'libvirt-override.py')
-rw-r--r--libvirt-override.py26
1 files changed, 24 insertions, 2 deletions
diff --git a/libvirt-override.py b/libvirt-override.py
index b611ca4..8df9dc1 100644
--- a/libvirt-override.py
+++ b/libvirt-override.py
@@ -117,19 +117,41 @@ def getVersion (name = None):
#
# Invoke an EventHandle callback
#
-def eventInvokeHandleCallback (watch, fd, event, callback, opaque):
+def eventInvokeHandleCallback(watch, fd, event, opaque, opaquecompat=None):
"""
Invoke the Event Impl Handle Callback in C
"""
+ # libvirt 0.9.2 and earlier required custom event loops to know
+ # that opaque=(cb, original_opaque) and pass the values individually
+ # to this wrapper. This should handle the back compat case, and make
+ # future invocations match the virEventHandleCallback prototype
+ if opaquecompat:
+ callback = opaque
+ opaque = opaquecompat
+ else:
+ callback = opaque[0]
+ opaque = opaque[1]
+
libvirtmod.virEventInvokeHandleCallback(watch, fd, event, callback, opaque);
#
# Invoke an EventTimeout callback
#
-def eventInvokeTimeoutCallback (timer, callback, opaque):
+def eventInvokeTimeoutCallback(timer, opaque, opaquecompat=None):
"""
Invoke the Event Impl Timeout Callback in C
"""
+ # libvirt 0.9.2 and earlier required custom event loops to know
+ # that opaque=(cb, original_opaque) and pass the values individually
+ # to this wrapper. This should handle the back compat case, and make
+ # future invocations match the virEventTimeoutCallback prototype
+ if opaquecompat:
+ callback = opaque
+ opaque = opaquecompat
+ else:
+ callback = opaque[0]
+ opaque = opaque[1]
+
libvirtmod.virEventInvokeTimeoutCallback(timer, callback, opaque);
def _dispatchEventHandleCallback(watch, fd, events, cbData):