[libvirt] [PATCH 09/10] python: events: Fix C->Python handle callback prototype

Daniel Veillard veillard at redhat.com
Mon Jun 20 01:44:08 UTC 2011


On Wed, Jun 15, 2011 at 09:23:18PM -0400, Cole Robinson wrote:
> If registering our own event loop implementation written in python,
> any handles or timeouts callbacks registered by libvirt C code must
> are wrapped in a python function. There is some argument trickery that

  "must be" :-)

> 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.
> 
> Signed-off-by: Cole Robinson <crobinso at redhat.com>
> ---
>  examples/domain-events/events-python/event-test.py |    6 +---
>  python/libvirt-override.py                         |   26 ++++++++++++++++++-
>  2 files changed, 26 insertions(+), 6 deletions(-)
> 
> diff --git a/examples/domain-events/events-python/event-test.py b/examples/domain-events/events-python/event-test.py
> index df75dce..76fda2b 100644
> --- a/examples/domain-events/events-python/event-test.py
> +++ b/examples/domain-events/events-python/event-test.py
> @@ -66,8 +66,7 @@ class virEventLoopPure:
>              self.cb(self.handle,
>                      self.fd,
>                      events,
> -                    self.opaque[0],
> -                    self.opaque[1])
> +                    self.opaque)
>  
>      # This class contains the data we need to track for a
>      # single periodic timer
> @@ -96,8 +95,7 @@ class virEventLoopPure:
>  
>          def dispatch(self):
>              self.cb(self.timer,
> -                    self.opaque[0],
> -                    self.opaque[1])
> +                    self.opaque)
>  
>  
>      def __init__(self):
> diff --git a/python/libvirt-override.py b/python/libvirt-override.py
> index b611ca4..8df9dc1 100644
> --- a/python/libvirt-override.py
> +++ b/python/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);

  I would rather use dynamic type test like
    if type(callback) == type(()) and type(callback[0]) == type(lambda x:x):

than rely on an extra argument detection
Note: I didn't tried, I don't know if python type will allow the test
for functions and lambda to work, otherwise use a predefined function
or another one from the module.

>  #
>  # 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);

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list