From: Ian Campbell <Ian.Campbell@citrix.com>
To: Rob Hoes <rob.hoes@citrix.com>
Cc: ian.jackson@eu.citrix.com, xen-devel@lists.xen.org
Subject: Re: [PATCH v3-RESEND 28/28] libxl: ocaml: add console reader functions
Date: Thu, 31 Oct 2013 18:45:32 +0000 [thread overview]
Message-ID: <1383245132.5436.75.camel@dagon.hellion.org.uk> (raw)
In-Reply-To: <1382362365-6645-29-git-send-email-rob.hoes@citrix.com>
On Mon, 2013-10-21 at 14:32 +0100, Rob Hoes wrote:
> Signed-off-by: Rob Hoes <rob.hoes@citrix.com>
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@citrix.com>
>
> ---
> 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
> + ()
> +
next prev parent reply other threads:[~2013-10-31 18:45 UTC|newest]
Thread overview: 70+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-21 13:32 libxl: ocaml: improve the bindings Rob Hoes
2013-10-21 13:32 ` [PATCH v3-RESEND 01/28] libxl: idl: allow KeyedUnion members to be empty Rob Hoes
2013-10-21 13:32 ` [PATCH v3-RESEND 02/28] libxl: ocaml: support for Arrays in bindings generator Rob Hoes
2013-10-21 13:32 ` [PATCH v3-RESEND 03/28] libxl: ocaml: avoid reserved words in type and field names Rob Hoes
2013-10-24 22:04 ` Ian Campbell
2013-10-24 22:11 ` Rob Hoes
2013-10-25 6:56 ` Ian Campbell
2013-10-25 8:44 ` Rob Hoes
2013-10-28 15:24 ` Ian Jackson
2013-10-31 13:43 ` Ian Campbell
2013-10-31 14:27 ` Ian Jackson
2013-10-31 17:20 ` Ian Campbell
2013-11-04 14:59 ` Rob Hoes
2013-10-21 13:32 ` [PATCH v3-RESEND 04/28] libxl: ocaml: support for KeyedUnion in the bindings generator Rob Hoes
2013-10-21 13:32 ` [PATCH v3-RESEND 05/28] libxl: ocaml: add some more builtin types Rob Hoes
2013-10-21 13:32 ` [PATCH v3-RESEND 06/28] libxc: ocaml: add simple binding for xentoollog (output only) Rob Hoes
2013-11-13 13:45 ` Ian Campbell
2013-11-14 14:11 ` Rob Hoes
2013-11-15 11:48 ` Andrew Cooper
2013-10-21 13:32 ` [PATCH v3-RESEND 07/28] libxl: ocaml: allocate a long lived libxl context Rob Hoes
2013-10-21 13:32 ` [PATCH v3-RESEND 08/28] libxl: ocaml: switch all functions over to take a context Rob Hoes
2013-10-21 13:32 ` [PATCH v3-RESEND 09/28] libxl: make the libxl error type an IDL enum Rob Hoes
2013-10-31 18:07 ` Ian Campbell
2013-11-04 14:48 ` Rob Hoes
2013-11-04 15:05 ` Ian Campbell
2013-10-21 13:32 ` [PATCH v3-RESEND 10/28] libxl: ocaml: generate string_of_* functions for enums Rob Hoes
2013-10-31 18:13 ` Ian Campbell
2013-11-06 10:30 ` Rob Hoes
2013-10-21 13:32 ` [PATCH v3-RESEND 11/28] libxl: ocaml: propagate the libxl return error code in exceptions Rob Hoes
2013-10-21 13:32 ` [PATCH v3-RESEND 12/28] libxl: ocaml: make Val_defbool GC-proof Rob Hoes
2013-10-31 18:15 ` Ian Campbell
2013-10-31 18:55 ` Ian Jackson
2013-10-31 18:57 ` Ian Jackson
2013-10-31 19:10 ` Ian Campbell
2013-10-31 19:42 ` Dave Scott
2013-10-31 19:19 ` Ian Jackson
2013-10-21 13:32 ` [PATCH v3-RESEND 13/28] libxl: ocaml: add domain_build/create_info/config and events to the bindings Rob Hoes
2013-10-21 13:32 ` [PATCH v3-RESEND 14/28] libxl: ocaml: add META to list of generated files in Makefile Rob Hoes
2013-10-31 18:47 ` Ian Campbell
2013-10-21 13:32 ` [PATCH v3-RESEND 15/28] libxl: ocaml: fix the handling of enums in the bindings generator Rob Hoes
2013-10-21 13:32 ` [PATCH v3-RESEND 16/28] libxl: ocaml: use the "string option" type for IDL strings Rob Hoes
2013-10-31 18:18 ` Ian Campbell
2013-10-31 18:48 ` Ian Campbell
2013-10-21 13:32 ` [PATCH v3-RESEND 17/28] libxl: ocaml: add dominfo_list and dominfo_get Rob Hoes
2013-10-21 13:32 ` [PATCH v3-RESEND 18/28] libxl: ocaml: implement some simple tests Rob Hoes
2013-10-21 13:32 ` [PATCH v3-RESEND 19/28] libxl: ocaml: event management Rob Hoes
2013-10-21 13:32 ` [PATCH v3-RESEND 20/28] libxl: ocaml: allow device operations to be called asynchronously Rob Hoes
2013-10-31 18:21 ` Ian Campbell
2013-11-06 11:46 ` Rob Hoes
2013-11-06 12:02 ` Ian Campbell
2013-10-21 13:32 ` [PATCH v3-RESEND 21/28] libxl: ocaml: add NIC helper functions Rob Hoes
2013-10-31 18:23 ` Ian Campbell
2013-11-06 11:55 ` Rob Hoes
2013-10-21 13:32 ` [PATCH v3-RESEND 22/28] libxl: ocaml: add PCI device " Rob Hoes
2013-10-31 18:24 ` Ian Campbell
2013-10-21 13:32 ` [PATCH v3-RESEND 23/28] libxl: ocaml: add disk and cdrom " Rob Hoes
2013-10-31 18:25 ` Ian Campbell
2013-10-21 13:32 ` [PATCH v3-RESEND 24/28] libxl: ocaml: add VM lifecycle operations Rob Hoes
2013-10-31 18:36 ` Ian Campbell
2013-11-06 12:20 ` Rob Hoes
2013-10-21 13:32 ` [PATCH v3-RESEND 25/28] libxl: ocaml: in send_debug_keys, clean up before raising exception Rob Hoes
2013-10-31 18:38 ` Ian Campbell
2013-11-06 13:56 ` Rob Hoes
2013-10-21 13:32 ` [PATCH v3-RESEND 26/28] libxl: ocaml: provide defaults for libxl types Rob Hoes
2013-10-31 18:43 ` Ian Campbell
2013-10-21 13:32 ` [PATCH v3-RESEND 27/28] libxl: ocaml: use CAMLlocal1 macro rather than value-type in auto-generated C-code Rob Hoes
2013-10-31 18:48 ` Ian Campbell
2013-10-21 13:32 ` [PATCH v3-RESEND 28/28] libxl: ocaml: add console reader functions Rob Hoes
2013-10-31 18:45 ` Ian Campbell [this message]
2013-10-23 11:33 ` libxl: ocaml: improve the bindings David Scott
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1383245132.5436.75.camel@dagon.hellion.org.uk \
--to=ian.campbell@citrix.com \
--cc=ian.jackson@eu.citrix.com \
--cc=rob.hoes@citrix.com \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).