[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 22/28] libxl: ocaml: event management
This patch add the facilities needed to interact with the event system in libxl. This is useful, for instance, for getting a callback when a domains dies, as well as to use the asyncronous versions of some of libxl's calls. The functions dealing with timeouts are still TBD. Signed-off-by: Rob Hoes <rob.hoes@xxxxxxxxxx> --- tools/ocaml/libs/xl/xenlight.ml.in | 42 +++++++++ tools/ocaml/libs/xl/xenlight.mli.in | 21 +++++ tools/ocaml/libs/xl/xenlight_stubs.c | 161 ++++++++++++++++++++++++++++++++++ 3 files changed, 224 insertions(+) diff --git a/tools/ocaml/libs/xl/xenlight.ml.in b/tools/ocaml/libs/xl/xenlight.ml.in index 63b8bf8..96d6a38 100644 --- a/tools/ocaml/libs/xl/xenlight.ml.in +++ b/tools/ocaml/libs/xl/xenlight.ml.in @@ -73,6 +73,17 @@ external test_raise_exception: unit -> unit = "stub_raise_exception" type domid = int type devid = int +(* type for event callbacks *) +type for_libxl + +type event = + | POLLIN (* There is data to read *) + | POLLPRI (* There is urgent data to read *) + | POLLOUT (* Writing now will not block *) + | POLLERR (* Error condition (revents only) *) + | POLLHUP (* Device has been disconnected (revents only) *) + | POLLNVAL (* Invalid request: fd not open (revents only). *) + (* @@LIBXL_TYPES@@ *) external send_trigger : ctx -> domid -> trigger -> int -> unit = "stub_xl_send_trigger" @@ -80,4 +91,35 @@ external send_sysrq : ctx -> domid -> char -> unit = "stub_xl_send_sysrq" external send_debug_keys : ctx -> string -> unit = "stub_xl_send_debug_keys" external xen_console_read : ctx -> string list = "stub_xl_xen_console_read" +(* Callbacks with the names as in the following must be registered before calling + osevent_register_hooks: + + Callback.register "fd_register" fd_register; + Callback.register "fd_modify" fd_modify; + Callback.register "fd_deregister" fd_deregister; +*) + +external osevent_register_hooks : ctx -> 'a -> 'b = "stub_xl_osevent_register_hooks" +external osevent_occurred_fd : ctx -> for_libxl -> Unix.file_descr -> event list -> event list -> unit = "stub_xl_osevent_occurred_fd" +external osevent_occurred_timeout : ctx -> for_libxl -> unit = "stub_xl_osevent_occurred_timeout" + +(* A callback with a name as in the following must be registered for async calls + to libxl functions to work: + + Callback.register "xl_async_callback" xl_async_callback; +*) + +(* Callbacks with the names as in the following must be registered before calling + event_register_callbacks: + + Callback.register "xl_event_occurs_callback" xl_event_occurs_callback; + Callback.register "xl_event_disaster_callback" xl_event_disaster_callback; +*) +external evenable_domain_death : ctx -> domid -> int -> unit = "stub_xl_evenable_domain_death" +external event_register_callbacks : ctx -> 'a -> 'b = "stub_xl_event_register_callbacks" + +(* event loop helper wrapping the poll syscall *) +external poll : (Unix.file_descr * event list) list -> event list list = "stub_poll" + let _ = Callback.register_exception "Xenlight.Error" (Error(Fail, "")) + diff --git a/tools/ocaml/libs/xl/xenlight.mli.in b/tools/ocaml/libs/xl/xenlight.mli.in index 24064fc..d66f666 100644 --- a/tools/ocaml/libs/xl/xenlight.mli.in +++ b/tools/ocaml/libs/xl/xenlight.mli.in @@ -45,9 +45,30 @@ external test_raise_exception: unit -> unit = "stub_raise_exception" type domid = int type devid = int +(* type for event callbacks *) +type for_libxl + +type event = + | POLLIN (* There is data to read *) + | POLLPRI (* There is urgent data to read *) + | POLLOUT (* Writing now will not block *) + | POLLERR (* Error condition (revents only) *) + | POLLHUP (* Device has been disconnected (revents only) *) + | POLLNVAL (* Invalid request: fd not open (revents only). *) + (* @@LIBXL_TYPES@@ *) external send_trigger : ctx -> domid -> trigger -> int -> unit = "stub_xl_send_trigger" external send_sysrq : ctx -> domid -> char -> unit = "stub_xl_send_sysrq" external send_debug_keys : ctx -> string -> unit = "stub_xl_send_debug_keys" external xen_console_read : ctx -> string list = "stub_xl_xen_console_read" + +external osevent_register_hooks : ctx -> 'a -> 'b = "stub_xl_osevent_register_hooks" +external osevent_occurred_fd : ctx -> for_libxl -> Unix.file_descr -> event list -> event list -> unit = "stub_xl_osevent_occurred_fd" +external osevent_occurred_timeout : ctx -> for_libxl -> unit = "stub_xl_osevent_occurred_timeout" + +external evenable_domain_death : ctx -> domid -> int -> unit = "stub_xl_evenable_domain_death" +external event_register_callbacks : ctx -> 'a -> 'b = "stub_xl_event_register_callbacks" + +external poll : (Unix.file_descr * event list) list -> event list list = "stub_poll" + diff --git a/tools/ocaml/libs/xl/xenlight_stubs.c b/tools/ocaml/libs/xl/xenlight_stubs.c index a8655ad..ae5317f 100644 --- a/tools/ocaml/libs/xl/xenlight_stubs.c +++ b/tools/ocaml/libs/xl/xenlight_stubs.c @@ -29,6 +29,10 @@ #include <libxl.h> #include <libxl_utils.h> +#include <unistd.h> + +#include "poll_stubs.h" + #define CTX ((libxl_ctx *)ctx) static char * dup_String_val(value s) @@ -323,6 +327,13 @@ static char *String_option_val(value v) #include "_libxl_types.inc" +void async_callback(libxl_ctx *ctx, int rc, void *for_callback) +{ + int *task = (int *) for_callback; + value *func = caml_named_value("xl_async_callback"); + caml_callback2(*func, (value) for_callback, Val_int(rc)); +} + #define _STRINGIFY(x) #x #define STRINGIFY(x) _STRINGIFY(x) @@ -552,6 +563,156 @@ value stub_xl_xen_console_read(value ctx) CAMLreturn(list); } +int fd_register(void *user, int fd, void **for_app_registration_out, + short events, void *for_libxl) +{ + CAMLparam0(); + CAMLlocalN(args, 4); + value *func = caml_named_value("fd_register"); + + args[0] = (value) user; + args[1] = Val_int(fd); + args[2] = Val_poll_events(events); + args[3] = (value) for_libxl; + + caml_callbackN(*func, 4, args); + CAMLreturn(0); +} + +int fd_modify(void *user, int fd, void **for_app_registration_update, + short events) +{ + CAMLparam0(); + CAMLlocalN(args, 3); + value *func = caml_named_value("fd_modify"); + + args[0] = (value) user; + args[1] = Val_int(fd); + args[2] = Val_poll_events(events); + + caml_callbackN(*func, 3, args); + CAMLreturn(0); +} + +void fd_deregister(void *user, int fd, void *for_app_registration) +{ + CAMLparam0(); + CAMLlocalN(args, 2); + value *func = caml_named_value("fd_deregister"); + + args[0] = (value) user; + args[1] = Val_int(fd); + + caml_callbackN(*func, 2, args); + CAMLreturn0; +} + +int timeout_register(void *user, void **for_app_registration_out, + struct timeval abs, void *for_libxl) +{ + return 0; +} + +int timeout_modify(void *user, void **for_app_registration_update, + struct timeval abs) +{ + return 0; +} + +void timeout_deregister(void *user, void *for_app_registration) +{ + return; +} + +value stub_xl_osevent_register_hooks(value ctx, value user) +{ + CAMLparam2(ctx, user); + libxl_osevent_hooks *hooks; + hooks = malloc(sizeof(*hooks)); + + hooks->fd_register = fd_register; + hooks->fd_modify = fd_modify; + hooks->fd_deregister = fd_deregister; + hooks->timeout_register = timeout_register; + hooks->timeout_modify = timeout_modify; + hooks->timeout_deregister = timeout_deregister; + + libxl_osevent_register_hooks(CTX, hooks, (void *) user); + + CAMLreturn((value) hooks); +} + +value stub_xl_osevent_occurred_fd(value ctx, value for_libxl, value fd, + value events, value revents) +{ + CAMLparam5(ctx, for_libxl, fd, events, revents); + libxl_osevent_occurred_fd(CTX, (void *) for_libxl, Int_val(fd), + Poll_events_val(events), Poll_events_val(revents)); + CAMLreturn(Val_unit); +} + +value stub_xl_osevent_occurred_timeout(value ctx, value for_libxl) +{ + CAMLparam2(ctx, for_libxl); + libxl_osevent_occurred_timeout(CTX, (void *) for_libxl); + CAMLreturn(Val_unit); +} + +void event_occurs(void *user, const libxl_event *event) +{ + CAMLparam0(); + CAMLlocalN(args, 2); + value *func = caml_named_value("xl_event_occurs_callback"); + + args[0] = (value) user; + args[1] = Val_event((libxl_event *) event); + //libxl_event_free(CTX, event); // no ctx here! + + caml_callbackN(*func, 2, args); + CAMLreturn0; +} + +void disaster(void *user, libxl_event_type type, + const char *msg, int errnoval) +{ + CAMLparam0(); + CAMLlocalN(args, 2); + value *func = caml_named_value("xl_event_disaster_callback"); + + args[0] = (value) user; + args[1] = Val_event_type(type); + args[2] = caml_copy_string(msg); + args[3] = Val_int(errnoval); + + caml_callbackN(*func, 4, args); + CAMLreturn0; +} + +value stub_xl_event_register_callbacks(value ctx, value user) +{ + CAMLparam2(ctx, user); + libxl_event_hooks *hooks; + + hooks = malloc(sizeof(*hooks)); + hooks->event_occurs_mask = LIBXL_EVENTMASK_ALL; + hooks->event_occurs = event_occurs; + hooks->disaster = disaster; + + libxl_event_register_callbacks(CTX, (const libxl_event_hooks *) hooks, (void *) user); + + CAMLreturn((value) hooks); +} + +value stub_xl_evenable_domain_death(value ctx, value domid, value user) +{ + CAMLparam3(ctx, domid, user); + libxl_evgen_domain_death *evgen_out; + + libxl_evenable_domain_death(CTX, Int_val(domid), Int_val(user), &evgen_out); + + CAMLreturn(Val_unit); +} + /* * Local variables: * indent-tabs-mode: t -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |