xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
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
> +	()
> +

  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).