[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v3-RESEND 28/28] libxl: ocaml: add console reader functions



On Mon, 2013-10-21 at 14:32 +0100, Rob Hoes wrote:
> Signed-off-by: Rob Hoes <rob.hoes@xxxxxxxxxx>

In so far as I have any clue at all what the right way to do these sorts
of complex type ocaml bindings:
Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

> 
> ---
> New in v3:
> * Replacing the "add xen_console_read" patch, with the more light-weight
>   line-by-line reader functions.
> ---
>  tools/ocaml/libs/xl/xenlight.ml.in   |   10 ++++-
>  tools/ocaml/libs/xl/xenlight.mli.in  |    7 ++++
>  tools/ocaml/libs/xl/xenlight_stubs.c |   68 
> ++++++++++++++++++++++++++++++++++
>  tools/ocaml/test/Makefile            |   12 ++++--
>  tools/ocaml/test/dmesg.ml            |   18 +++++++++
>  5 files changed, 111 insertions(+), 4 deletions(-)
>  create mode 100644 tools/ocaml/test/dmesg.ml
> 
> diff --git a/tools/ocaml/libs/xl/xenlight.ml.in 
> b/tools/ocaml/libs/xl/xenlight.ml.in
> index 8388c5f..6c95f14 100644
> --- a/tools/ocaml/libs/xl/xenlight.ml.in
> +++ b/tools/ocaml/libs/xl/xenlight.ml.in
> @@ -50,6 +50,13 @@ module Domain = struct
>  end
>  
>  module Host = struct
> +     type console_reader
> +     exception End_of_file
> +
> +     external xen_console_read_start : ctx -> int -> console_reader  = 
> "stub_libxl_xen_console_read_start"
> +     external xen_console_read_line : ctx -> console_reader -> string = 
> "stub_libxl_xen_console_read_line"
> +     external xen_console_read_finish : ctx -> console_reader -> unit = 
> "stub_libxl_xen_console_read_finish"
> +
>       external send_debug_keys : ctx -> string -> unit = 
> "stub_xl_send_debug_keys"
>  end
>  
> @@ -112,5 +119,6 @@ module Async = functor (S: EVENT_USERS) -> struct
>  end
>  
>  let register_exceptions () =
> -     Callback.register_exception "Xenlight.Error" (Error(ERROR_FAIL, ""))
> +     Callback.register_exception "Xenlight.Error" (Error(ERROR_FAIL, ""));
> +     Callback.register_exception "Xenlight.Host.End_of_file" 
> (Host.End_of_file)
>  
> diff --git a/tools/ocaml/libs/xl/xenlight.mli.in 
> b/tools/ocaml/libs/xl/xenlight.mli.in
> index 31faf26..e489d19 100644
> --- a/tools/ocaml/libs/xl/xenlight.mli.in
> +++ b/tools/ocaml/libs/xl/xenlight.mli.in
> @@ -52,6 +52,13 @@ module Domain : sig
>  end
>  
>  module Host : sig
> +     type console_reader
> +     exception End_of_file
> +
> +     external xen_console_read_start : ctx -> int -> console_reader  = 
> "stub_libxl_xen_console_read_start"
> +     external xen_console_read_line : ctx -> console_reader -> string = 
> "stub_libxl_xen_console_read_line"
> +     external xen_console_read_finish : ctx -> console_reader -> unit = 
> "stub_libxl_xen_console_read_finish"
> +
>       external send_debug_keys : ctx -> string -> unit = 
> "stub_xl_send_debug_keys"
>  end
>  
> diff --git a/tools/ocaml/libs/xl/xenlight_stubs.c 
> b/tools/ocaml/libs/xl/xenlight_stubs.c
> index 0c45743..cab4ed4 100644
> --- a/tools/ocaml/libs/xl/xenlight_stubs.c
> +++ b/tools/ocaml/libs/xl/xenlight_stubs.c
> @@ -975,6 +975,74 @@ value stub_xl_send_debug_keys(value ctx, value keys)
>       CAMLreturn(Val_unit);
>  }
>  
> +static struct custom_operations libxl_console_reader_custom_operations = {
> +     "libxl_console_reader_custom_operations",
> +     custom_finalize_default,
> +     custom_compare_default,
> +     custom_hash_default,
> +     custom_serialize_default,
> +     custom_deserialize_default
> +};
> +
> +#define Console_reader_val(x)(*((libxl_xen_console_reader **) 
> Data_custom_val(x)))
> +
> +value stub_libxl_xen_console_read_start(value ctx, value clear)
> +{
> +     CAMLparam2(ctx, clear);
> +     CAMLlocal1(handle);
> +     libxl_xen_console_reader *cr;
> +
> +     cr = libxl_xen_console_read_start(CTX, Int_val(clear));
> +
> +     handle = caml_alloc_custom(&libxl_console_reader_custom_operations, 
> sizeof(cr), 0, 1);
> +     Console_reader_val(handle) = cr;
> +
> +     CAMLreturn(handle);
> +}
> +
> +static void raise_eof(void)
> +{
> +     static value *exc = NULL;
> +
> +     /* First time around, lookup by name */
> +     if (!exc)
> +             exc = caml_named_value("Xenlight.Host.End_of_file");
> +
> +     if (!exc)
> +             caml_invalid_argument("Exception Xenlight.Host.End_of_file not 
> initialized, please link xenlight.cma");
> +
> +     caml_raise_constant(*exc);
> +}
> +
> +value stub_libxl_xen_console_read_line(value ctx, value reader)
> +{
> +     CAMLparam2(ctx, reader);
> +     CAMLlocal1(line);
> +     int ret;
> +     char *c_line;
> +     libxl_xen_console_reader *cr = (libxl_xen_console_reader *) 
> Console_reader_val(reader);
> +
> +     ret = libxl_xen_console_read_line(CTX, cr, &c_line);
> +
> +     if (ret < 0)
> +             failwith_xl(ret, "xen_console_read_line");
> +     if (ret == 0)
> +             raise_eof();
> +
> +     line = caml_copy_string(c_line);
> +
> +     CAMLreturn(line);
> +}
> +
> +value stub_libxl_xen_console_read_finish(value ctx, value reader)
> +{
> +     CAMLparam2(ctx, reader);
> +     libxl_xen_console_reader *cr = (libxl_xen_console_reader *) 
> Console_reader_val(reader);
> +
> +     libxl_xen_console_read_finish(CTX, cr);
> +
> +     CAMLreturn(Val_unit);
> +}
>  
>  /* Event handling */
>  
> diff --git a/tools/ocaml/test/Makefile b/tools/ocaml/test/Makefile
> index 8387d43..e6ba865 100644
> --- a/tools/ocaml/test/Makefile
> +++ b/tools/ocaml/test/Makefile
> @@ -9,9 +9,9 @@ OCAMLINCLUDE += \
>       -I $(OCAML_TOPLEVEL)/libs/xentoollog \
>       -I $(OCAML_TOPLEVEL)/libs/xl
>  
> -OBJS = xtl send_debug_keys list_domains raise_exception
> +OBJS = xtl send_debug_keys list_domains raise_exception dmesg
>  
> -PROGRAMS = xtl send_debug_keys list_domains raise_exception
> +PROGRAMS = xtl send_debug_keys list_domains raise_exception dmesg
>  
>  xtl_LIBS =  \
>       -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xentoollog 
> $(OCAML_TOPLEVEL)/libs/xentoollog/xentoollog.cmxa \
> @@ -37,7 +37,13 @@ raise_exception_LIBS =  \
>  
>  raise_exception_OBJS = raise_exception
>  
> -OCAML_PROGRAM = xtl send_debug_keys list_domains raise_exception
> +dmesg_LIBS =  \
> +     -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xentoollog 
> $(OCAML_TOPLEVEL)/libs/xentoollog/xentoollog.cmxa \
> +     -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xl 
> $(OCAML_TOPLEVEL)/libs/xl/xenlight.cmxa
> +
> +dmesg_OBJS = xtl dmesg
> +
> +OCAML_PROGRAM = xtl send_debug_keys list_domains raise_exception dmesg
>  
>  all: $(PROGRAMS)
>  
> diff --git a/tools/ocaml/test/dmesg.ml b/tools/ocaml/test/dmesg.ml
> new file mode 100644
> index 0000000..864fac4
> --- /dev/null
> +++ b/tools/ocaml/test/dmesg.ml
> @@ -0,0 +1,18 @@
> +open Printf
> +
> +let _ =
> +     Xenlight.register_exceptions ();
> +     let logger = Xtl.create_stdio_logger ~level:Xentoollog.Debug () in
> +     let ctx = Xenlight.ctx_alloc logger in
> +
> +     let open Xenlight.Host in
> +     let reader = xen_console_read_start ctx 0 in
> +     (try
> +             while true do
> +                     let line = xen_console_read_line ctx reader in
> +                     print_string line
> +             done
> +     with End_of_file -> ());
> +     let _ = xen_console_read_finish ctx reader in
> +     ()
> +



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.