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

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



Signed-off-by: Rob Hoes <rob.hoes@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
+       ()
+
-- 
1.7.10.4


_______________________________________________
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®.