From mboxrd@z Thu Jan 1 00:00:00 1970 From: Rob Hoes Subject: [PATCH 11/28] libxl: ocaml: propagate the libxl return error code in exceptions Date: Mon, 25 Mar 2013 14:45:12 +0000 Message-ID: <1364222729-6982-12-git-send-email-rob.hoes@citrix.com> References: <1364222729-6982-1-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: <1364222729-6982-1-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: xen-devel@lists.xen.org Cc: ian.campbell@citrix.com, Rob Hoes List-Id: xen-devel@lists.xenproject.org Signed-off-by: Ian Campbell Signed-off-by: Rob Hoes --- tools/ocaml/libs/xl/genwrap.py | 10 +++--- tools/ocaml/libs/xl/xenlight.ml.in | 45 ++++++++++++++++++++--- tools/ocaml/libs/xl/xenlight.mli.in | 28 ++++++++++++--- tools/ocaml/libs/xl/xenlight_stubs.c | 66 +++++++++++++++++++++++++++------- 4 files changed, 123 insertions(+), 26 deletions(-) diff --git a/tools/ocaml/libs/xl/genwrap.py b/tools/ocaml/libs/xl/genwrap.py index b087817..9e440ae 100644 --- a/tools/ocaml/libs/xl/genwrap.py +++ b/tools/ocaml/libs/xl/genwrap.py @@ -229,7 +229,7 @@ def c_val(ty, c, o, indent="", parent = None): for e in ty.values: s += " case %d: *%s = %s; break;\n" % (n, c, e.name) n += 1 - s += " default: failwith_xl(\"cannot convert value to %s\"); break;\n" % ty.typename + s += " default: failwith_xl(ERROR_FAIL, \"cannot convert value to %s\"); break;\n" % ty.typename s += "}" elif isinstance(ty, idl.KeyedUnion): s += "{\n" @@ -242,7 +242,7 @@ def c_val(ty, c, o, indent="", parent = None): parent + ty.keyvar.name, f.enumname) n += 1 - s += "\t\t default: failwith_xl(\"variant handling bug %s%s (long)\"); break;\n" % (parent, ty.keyvar.name) + s += "\t\t default: failwith_xl(ERROR_FAIL, \"variant handling bug %s%s (long)\"); break;\n" % (parent, ty.keyvar.name) s += "\t\t}\n" s += "\t} else {\n" s += "\t\t/* Is block... */\n" @@ -258,7 +258,7 @@ def c_val(ty, c, o, indent="", parent = None): s += "%s" % c_val(f.type, fexpr, "Field(%s, 0)" % o, indent=indent+"\t\t ") s += "break;\n" n += 1 - s += "\t\t default: failwith_xl(\"variant handling bug %s%s (block)\"); break;\n" % (parent, ty.keyvar.name) + s += "\t\t default: failwith_xl(ERROR_FAIL, \"variant handling bug %s%s (block)\"); break;\n" % (parent, ty.keyvar.name) s += "\t\t}\n" s += "\t}\n" s += "}" @@ -327,7 +327,7 @@ def ocaml_Val(ty, o, c, indent="", parent = None, struct_tag = None): for e in ty.values: s += " case %s: %s = Int_val(%d); break;\n" % (e.name, o, n) n += 1 - s += " default: failwith_xl(\"cannot convert value from %s\"); break;\n" % ty.typename + s += " default: failwith_xl(ERROR_FAIL, \"cannot convert value from %s\"); break;\n" % ty.typename s += "}" elif isinstance(ty, idl.KeyedUnion): n = 0 @@ -351,7 +351,7 @@ def ocaml_Val(ty, o, c, indent="", parent = None, struct_tag = None): m += 1 #s += "\t %s = caml_alloc(%d,%d);\n" % (o,len(f.type.fields),n) s += "\t break;\n" - s += "\t default: failwith_xl(\"cannot convert value from %s\"); break;\n" % ty.typename + s += "\t default: failwith_xl(ERROR_FAIL, \"cannot convert value from %s\"); break;\n" % ty.typename s += "\t}" elif isinstance(ty,idl.Aggregate) and (parent is None or ty.rawname is None): s += "{\n" diff --git a/tools/ocaml/libs/xl/xenlight.ml.in b/tools/ocaml/libs/xl/xenlight.ml.in index 319c593..3e83355 100644 --- a/tools/ocaml/libs/xl/xenlight.ml.in +++ b/tools/ocaml/libs/xl/xenlight.ml.in @@ -13,20 +13,55 @@ * GNU Lesser General Public License for more details. *) -exception Error of string +type error = + Nonspecific | + Version | + Fail | + Ni | + Nomem | + Inval | + Badfail | + Guest_Timedout | + Timedout | + Noparavirt | + Not_Ready | + Osevent_Reg_Fail | + Bufferfull | + Unknown_Child -type domid = int -type devid = int +let string_of_error error = + match error with + | Nonspecific -> "Non specific" + | Version -> "Version" + | Fail -> "Fail" + | Ni -> "Ni" + | Nomem -> "Nomem" + | Inval -> "Inval" + | Badfail -> "Badfail" + | Guest_Timedout -> "Guest Timedout" + | Timedout -> "Timedout" + | Noparavirt -> "Noparavirt" + | Not_Ready -> "Not Ready" + | Osevent_Reg_Fail -> "Osevent Reg Fail" + | Bufferfull -> "Bufferfull" + | Unknown_Child -> "Unknown Child" -(* @@LIBXL_TYPES@@ *) +exception Error of (error * string) type ctx external ctx_alloc: Xentoollog.handle -> ctx = "stub_libxl_ctx_alloc" external ctx_free: ctx -> unit = "stub_libxl_ctx_free" +external test_raise_exception: unit -> unit = "stub_raise_exception" + +type domid = int +type devid = int + +(* @@LIBXL_TYPES@@ *) + external send_trigger : ctx -> domid -> trigger -> int -> unit = "stub_xl_send_trigger" external send_sysrq : ctx -> domid -> char -> unit = "stub_xl_send_sysrq" external send_debug_keys : ctx -> string -> unit = "stub_xl_send_debug_keys" -let _ = Callback.register_exception "Xenlight.Error" (Error("")) +let _ = Callback.register_exception "Xenlight.Error" (Error(Fail, "")) diff --git a/tools/ocaml/libs/xl/xenlight.mli.in b/tools/ocaml/libs/xl/xenlight.mli.in index c797ceb..e562c4b 100644 --- a/tools/ocaml/libs/xl/xenlight.mli.in +++ b/tools/ocaml/libs/xl/xenlight.mli.in @@ -13,18 +13,38 @@ * GNU Lesser General Public License for more details. *) -exception Error of string +type error = + Nonspecific | + Version | + Fail | + Ni | + Nomem | + Inval | + Badfail | + Guest_Timedout | + Timedout | + Noparavirt | + Not_Ready | + Osevent_Reg_Fail | + Bufferfull | + Unknown_Child -type domid = int -type devid = int +val string_of_error: error -> string -(* @@LIBXL_TYPES@@ *) +exception Error of (error * string) type ctx external ctx_alloc: Xentoollog.handle -> ctx = "stub_libxl_ctx_alloc" external ctx_free: ctx -> unit = "stub_libxl_ctx_free" +external test_raise_exception: unit = "stub_raise_exception" + +type domid = int +type devid = int + +(* @@LIBXL_TYPES@@ *) + external send_trigger : ctx -> domid -> trigger -> int -> unit = "stub_xl_send_trigger" external send_sysrq : ctx -> domid -> char -> unit = "stub_xl_send_sysrq" external send_debug_keys : ctx -> string -> unit = "stub_xl_send_debug_keys" diff --git a/tools/ocaml/libs/xl/xenlight_stubs.c b/tools/ocaml/libs/xl/xenlight_stubs.c index c65d22d..6c26a6a 100644 --- a/tools/ocaml/libs/xl/xenlight_stubs.c +++ b/tools/ocaml/libs/xl/xenlight_stubs.c @@ -43,12 +43,54 @@ static char * dup_String_val(value s) return c; } -static void failwith_xl(char *fname) +static value Val_error(int error) { + switch (error) { + case ERROR_NONSPECIFIC: return Val_int(0); + case ERROR_VERSION: return Val_int(1); + case ERROR_FAIL: return Val_int(2); + case ERROR_NI: return Val_int(3); + case ERROR_NOMEM: return Val_int(4); + case ERROR_INVAL: return Val_int(5); + case ERROR_BADFAIL: return Val_int(6); + case ERROR_GUEST_TIMEDOUT: return Val_int(7); + case ERROR_TIMEDOUT: return Val_int(8); + case ERROR_NOPARAVIRT: return Val_int(9); + case ERROR_NOT_READY: return Val_int(10); + case ERROR_OSEVENT_REG_FAIL: return Val_int(11); + case ERROR_BUFFERFULL: return Val_int(12); + case ERROR_UNKNOWN_CHILD: return Val_int(13); +#if 0 /* Let the compiler catch this */ + default: + caml_raise_sys_error(caml_copy_string("Unknown libxl ERROR")); + break; +#endif + } + /* Should not reach here */ + abort(); +} + +static void failwith_xl(int error, char *fname) +{ + CAMLlocal1(arg); value *exc = caml_named_value("Xenlight.Error"); + if (!exc) caml_invalid_argument("Exception Xenlight.Error not initialized, please link xl.cma"); - caml_raise_with_string(*exc, fname); + + arg = caml_alloc_small(2, 0); + + Field(arg, 0) = Val_error(error); + Field(arg, 1) = caml_copy_string(fname); + + caml_raise_with_arg(*exc, arg); +} + +CAMLprim value stub_raise_exception(value unit) +{ + CAMLparam1(unit); + failwith_xl(ERROR_FAIL, "test exception"); + CAMLreturn(Val_unit); } CAMLprim value stub_libxl_ctx_alloc(value logger) @@ -59,7 +101,7 @@ CAMLprim value stub_libxl_ctx_alloc(value logger) ret = libxl_ctx_alloc(&ctx, LIBXL_VERSION, 0, (struct xentoollog_logger *) logger); if (ret != 0) \ - failwith_xl("cannot init context"); + failwith_xl(ERROR_FAIL, "cannot init context"); CAMLreturn((value)ctx); } @@ -185,7 +227,7 @@ static int Bitmap_val(libxl_ctx *ctx, libxl_bitmap *c_val, value v) c_val->size = 0; if (len > 0 && !libxl_bitmap_alloc(ctx, c_val, len)) - failwith_xl("cannot allocate bitmap"); + failwith_xl(ERROR_NOMEM, "cannot allocate bitmap"); for (i=0; i