From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ian Campbell Subject: Re: [PATCH v3-RESEND 28/28] libxl: ocaml: add console reader functions Date: Thu, 31 Oct 2013 18:45:32 +0000 Message-ID: <1383245132.5436.75.camel@dagon.hellion.org.uk> References: <1382362365-6645-1-git-send-email-rob.hoes@citrix.com> <1382362365-6645-29-git-send-email-rob.hoes@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1382362365-6645-29-git-send-email-rob.hoes@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Rob Hoes Cc: ian.jackson@eu.citrix.com, xen-devel@lists.xen.org List-Id: xen-devel@lists.xenproject.org On Mon, 2013-10-21 at 14:32 +0100, Rob Hoes wrote: > Signed-off-by: Rob Hoes 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 > > --- > 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 > + () > +