Add event callback implementation based on virConnectDomainEventRegisterAny
authorDavid Scott <scott.dj@gmail.com>
Wed, 24 Apr 2013 10:39:05 +0000 (11:39 +0100)
committerRichard W.M. Jones <rjones@redhat.com>
Wed, 8 May 2013 11:29:51 +0000 (12:29 +0100)
commit0d103e429ddc7942e537a047c8a46ca7ddc58e46
tree98b1ff2122d4e9288bddcfbf23e07dac523ddc28
parent0ec198e7784de1a49672183c961a2498b6c85b90
Add event callback implementation based on virConnectDomainEventRegisterAny

A client may register a callback as follows:

    E.register_default_impl ();

    let conn = C.connect_readonly ?name () in

    let id = E.register_any conn (E.Lifecycle (fun dom e ->
        printd dom "Lifecycle %s" (E.Lifecycle.to_string e)
    )) in

Internally this will:
  1. generate a unique int64 used to identify the specific callback
  2. add the callback to an OCaml hashtable based on the signature
     (there is a distinct hashtable per callback signature)
  3. call virConnectDomainEventRegisterAny which registers a
     generic C callback in the stubs (one distinct callback per
     signature) and supply the int64 as the "opaque" data

The client must enter the event loop with:

    while true do
        E.run_default_impl ()
    done

When an event is triggered, the C callback will upcall into an OCaml
function (having re-acquired the heap lock) supplying the int64 value.
The OCaml function can then find the right callback in the Hashtbl
and call it.

The client can deregister the callback with:

  E.deregister_any conn id;

Signed-off-by: David Scott <dave.scott@eu.citrix.com>
libvirt/generator.pl
libvirt/libvirt.ml
libvirt/libvirt.mli
libvirt/libvirt_c.c
libvirt/libvirt_c_oneoffs.c