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

Re: [Xen-API] [Xen-devel] [PATCH 08 of 15] libxl/ocaml: add some more builtin types



> # HG changeset patch
> # User Ian Campbell <ijc@xxxxxxxxxxxxxx> # Date 1353432141 0 # Node ID
> 21c5e58956d09437903e1ee1b0588d61a7c28145
> # Parent  0cf342afa9e6b506fad68346cb3a1207030372eb
> libxl/ocaml: add some more builtin types.
> 
>   * bitmaps
>   * string_list
>   * cpuid_policy_list (actually opaque)
>   * key_value_list
> 
> None of these are used yet, so no change to the generated code.
> 
> Bitmap_val requires a ctx, so leave it as an abort for now.
> 
> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
> 
> diff -r 0cf342afa9e6 -r 21c5e58956d0 tools/ocaml/libs/xl/genwrap.py
> --- a/tools/ocaml/libs/xl/genwrap.py  Tue Nov 20 17:22:21 2012 +0000
> +++ b/tools/ocaml/libs/xl/genwrap.py  Tue Nov 20 17:22:21 2012 +0000
> @@ -13,9 +13,13 @@ builtins = {
>      "libxl_devid":          ("devid",                  "%(c)s = 
> Int_val(%(o)s)",
> "Val_int(%(c)s)"  ),
>      "libxl_defbool":        ("bool option",            "%(c)s = 
> Defbool_val(%(o)s)",
> "Val_defbool(%(c)s)" ),
>      "libxl_uuid":           ("int array",              "Uuid_val(gc, lg, 
> &%(c)s, %(o)s)",
> "Val_uuid(&%(c)s)"),
> -    "libxl_key_value_list": ("(string * string) list", None,
> None),
> +    "libxl_bitmap":         ("bool array",             "Bitmap_val(gc, lg,
> &%(c)s, %(o)s)",   "Val_bitmap(&%(c)s)"),
> +    "libxl_key_value_list": ("(string * string) list",
> "libxl_key_value_list_val(gc, lg, &%(c)s, %(o)s)",                            
>   None),
> +    "libxl_string_list":    ("string list",            
> "libxl_string_list_val(gc, lg,
> &%(c)s, %(o)s)",                                 "String_list_val(gc, lg, 
> &%(c)s, %(o)s)"),
>      "libxl_mac":            ("int array",              "Mac_val(gc, lg, 
> &%(c)s, %(o)s)",
> "Val_mac(&%(c)s)"),
>      "libxl_hwcap":          ("int32 array",            None,
> "Val_hwcap(&%(c)s)"),
> +    # This is an opaque type
> +    "libxl_cpuid_policy_list": ("Cpuid_policy.t",      
> "Cpuid_policy_list_val(gc,
> lg, &%(c)s, %(o)s)",   "Val_cpuid_policy_list(&%(c)s)"),
>      }
> 
>  DEVICE_FUNCTIONS = [ ("add",            ["t", "domid", "unit"]),
> diff -r 0cf342afa9e6 -r 21c5e58956d0 tools/ocaml/libs/xl/xenlight.ml.in
> --- a/tools/ocaml/libs/xl/xenlight.ml.in      Tue Nov 20 17:22:21 2012
> +0000
> +++ b/tools/ocaml/libs/xl/xenlight.ml.in      Tue Nov 20 17:22:21 2012
> +0000
> @@ -18,6 +18,10 @@ exception Error of string  type domid = int  type devid
> = int
> 
> +module Cpuid_policy = struct
> +     type t
> +end
> +

Do you expect this type to become more complicated, or non-opaque, in future? 
Or would it have functions associated with it like for the devices? If not, 
perhaps we can use a simpler type definition:

type cpuid_policy_list

>  (* @@LIBXL_TYPES@@ *)
> 
>  external send_trigger : domid -> trigger -> int -> unit =
> "stub_xl_send_trigger"
> diff -r 0cf342afa9e6 -r 21c5e58956d0 tools/ocaml/libs/xl/xenlight_stubs.c
> --- a/tools/ocaml/libs/xl/xenlight_stubs.c    Tue Nov 20 17:22:21 2012
> +0000
> +++ b/tools/ocaml/libs/xl/xenlight_stubs.c    Tue Nov 20 17:22:21 2012
> +0000
> @@ -27,6 +27,7 @@
>  #include <string.h>
> 
>  #include <libxl.h>
> +#include <libxl_utils.h>
> 
>  struct caml_logger {
>       struct xentoollog_logger logger;
> @@ -96,7 +97,6 @@ static void failwith_xl(char *fname, str
>       caml_raise_with_string(*caml_named_value("xl.error"), s);  }
> 
> -#if 0 /* TODO: wrap libxl_domain_create(), these functions will be needed
> then */  static void * gc_calloc(caml_gc *gc, size_t nmemb, size_t size)  {
>       void *ptr;
> @@ -107,28 +107,62 @@ static void * gc_calloc(caml_gc *gc, siz
>       return ptr;
>  }
> 
> -static int string_string_tuple_array_val (caml_gc *gc, char ***c_val, value 
> v)
> +static int list_len(value v)
> +{
> +     int len = 0;
> +     while ( v != Val_emptylist ) {
> +             len++;
> +             v = Field(v, 1);
> +     }
> +     return len;
> +}
> +

It is probably best to use CAMLparam1(v) and CAMLreturn(len) here, just in case.

> +static int libxl_key_value_list_val(caml_gc *gc, struct caml_logger *lg,
> +                                 libxl_key_value_list *c_val,
> +                                 value v)
>  {
>       CAMLparam1(v);
> -     CAMLlocal1(a);
> -     int i;
> -     char **array;
> +     CAMLlocal1(elem);
> +     int nr, i;
> +     libxl_key_value_list array;
> 
> -     for (i = 0, a = Field(v, 5); a != Val_emptylist; a = Field(a, 1)) { 
> i++; }
> +     nr = list_len(v);
> 
> -     array = gc_calloc(gc, (i + 1) * 2, sizeof(char *));
> +     array = gc_calloc(gc, (nr + 1) * 2, sizeof(char *));
>       if (!array)
> -             return 1;
> -     for (i = 0, a = Field(v, 5); a != Val_emptylist; a = Field(a, 1), i++) {
> -             value b = Field(a, 0);
> -             array[i * 2] = dup_String_val(gc, Field(b, 0));
> -             array[i * 2 + 1] = dup_String_val(gc, Field(b, 1));
> +             caml_raise_out_of_memory();
> +
> +     for (i=0; v != Val_emptylist; i++, v = Field(v, 1) ) {
> +             elem = Field(v, 0);
> +
> +             array[i * 2] = dup_String_val(gc, Field(elem, 0));
> +             array[i * 2 + 1] = dup_String_val(gc, Field(elem, 1));
>       }
> +
>       *c_val = array;
>       CAMLreturn(0);
>  }
> 
> -#endif
> +static int libxl_string_list_val(caml_gc *gc, struct caml_logger *lg,
> +                              libxl_string_list *c_val,
> +                              value v)
> +{
> +     CAMLparam1(v);
> +     int nr, i;
> +     libxl_key_value_list array;

This should probably be a libxl_string_list.

> +
> +     nr = list_len(v);
> +
> +     array = gc_calloc(gc, (nr + 1), sizeof(char *));
> +     if (!array)
> +             caml_raise_out_of_memory();
> +
> +     for (i=0; v != Val_emptylist; i++, v = Field(v, 1) )
> +             array[i] = dup_String_val(gc, Field(v, 0));
> +
> +     *c_val = array;
> +     CAMLreturn(0);
> +}
> 
>  /* Option type support as per http://www.linux-
> nantes.org/~fmonnier/ocaml/ocaml-wrapping-c.php */  #define Val_none
> Val_int(0) @@ -168,6 +202,45 @@ static int Mac_val(caml_gc *gc, struct c
>       CAMLreturn(0);
>  }
> 
> +static value Val_bitmap (libxl_bitmap *c_val) {
> +     CAMLparam0();
> +     CAMLlocal1(v);
> +     int i;
> +
> +     v = caml_alloc(8 * (c_val->size), 0);
> +     libxl_for_each_bit(i, *c_val) {
> +             if (libxl_bitmap_test(c_val, i))
> +                     Store_field(v, i, Val_true);
> +             else
> +                     Store_field(v, i, Val_false);
> +     }
> +     CAMLreturn(v);
> +}
> +
> +static int Bitmap_val(caml_gc *gc, struct caml_logger *lg,
> +                   libxl_bitmap *c_val, value v)
> +{
> +     abort(); /* XXX */
> +}
> +
> +static value Val_cpuid_policy_list(libxl_cpuid_policy_list *c_val) {
> +     CAMLparam0();
> +     /* An opaque pointer */
> +     CAMLreturn((value)c_val);
> +}
> +
> +static int Cpuid_policy_list_val(caml_gc *gc, struct caml_logger *lg,
> +                              libxl_cpuid_policy_list **c_val, value v) {
> +     CAMLparam1(v);
> +
> +     /* An opaque pointer */
> +     *c_val = (libxl_cpuid_policy_list*)v;
> +     CAMLreturn(0);
> +}
> +
>  static value Val_uuid (libxl_uuid *c_val)  {
>       CAMLparam0();

For the rest it looks good to me.

Cheers,
Rob


_______________________________________________
Xen-api mailing list
Xen-api@xxxxxxxxxxxxx
http://lists.xen.org/cgi-bin/mailman/listinfo/xen-api


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.