[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2 of 2] RFC: libxl: move definition of libxl_domain_config into the IDL
# HG changeset patch # User Ian Campbell <ian.campbell@xxxxxxxxxx> # Date 1333535720 -3600 # Node ID dc3241cf1ed1b8e5709cc71c9ec8a93b2374cbd5 # Parent ac6f863df8f8c86dcc58df15f94333e6088e0bf4 RFC: libxl: move definition of libxl_domain_config into the IDL This requires adding a new Array type to the IDL. DO NOT APPLY. This is 4.3 material. Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> diff -r ac6f863df8f8 -r dc3241cf1ed1 tools/libxl/gentest.py --- a/tools/libxl/gentest.py Wed Apr 04 10:51:11 2012 +0100 +++ b/tools/libxl/gentest.py Wed Apr 04 11:35:20 2012 +0100 @@ -28,6 +28,18 @@ def gen_rand_init(ty, v, indent = " " s = "" if isinstance(ty, idl.Enumeration): s += "%s = %s;\n" % (ty.pass_arg(v, parent is None), randomize_enum(ty)) + elif isinstance(ty, idl.Array): + if parent is None: + raise Exception("Array type must have a parent") + s += "%s = rand()%%8;\n" % (parent + ty.lenvar.name) + s += "%s = calloc(%s, sizeof(*%s));\n" % \ + (v, parent + ty.lenvar.name, v) + s += "{\n" + s += " int i;\n" + s += " for (i=0; i<%s; i++)\n" % (parent + ty.lenvar.name) + s += gen_rand_init(ty.elem_type, v+"[i]", + indent + " ", parent) + s += "}\n" elif isinstance(ty, idl.KeyedUnion): if parent is None: raise Exception("KeyedUnion type must have a parent") diff -r ac6f863df8f8 -r dc3241cf1ed1 tools/libxl/gentypes.py --- a/tools/libxl/gentypes.py Wed Apr 04 10:51:11 2012 +0100 +++ b/tools/libxl/gentypes.py Wed Apr 04 11:35:20 2012 +0100 @@ -11,8 +11,12 @@ def libxl_C_instance_of(ty, instancename return libxl_C_type_define(ty) else: return libxl_C_type_define(ty) + " " + instancename - else: - return ty.typename + " " + instancename + + s = "" + if isinstance(ty, idl.Array): + s += libxl_C_instance_of(ty.lenvar.type, ty.lenvar.name) + ";\n" + + return s + ty.typename + " " + instancename def libxl_C_type_define(ty, indent = ""): s = "" @@ -66,6 +70,17 @@ def libxl_C_type_dispose(ty, v, indent = s += libxl_C_type_dispose(f.type, fexpr, indent + " ", nparent) s += " break;\n" s += "}\n" + elif isinstance(ty, idl.Array): + if parent is None: + raise Exception("Array type must have a parent") + s += "{\n" + s += " int i;\n" + s += " for (i=0; i<%s; i++)\n" % (parent + ty.lenvar.name) + s += libxl_C_type_dispose(ty.elem_type, v+"[i]", + indent + " ", parent) + if ty.dispose_fn is not None: + s += " %s(%s);\n" % (ty.dispose_fn, ty.pass_arg(v, parent is None)) + s += "}\n" elif isinstance(ty, idl.Struct) and (parent is None or ty.dispose_fn is None): for f in [f for f in ty.fields if not f.const]: (nparent,fexpr) = ty.member(v, f, parent is None) @@ -164,7 +179,24 @@ def libxl_C_type_gen_json(ty, v, indent s = "" if parent is None: s += "yajl_gen_status s;\n" - if isinstance(ty, idl.Enumeration): + + if isinstance(ty, idl.Array): + if parent is None: + raise Exception("Array type must have a parent") + s += "{\n" + s += " int i;\n" + s += " s = yajl_gen_array_open(hand);\n" + s += " if (s != yajl_gen_status_ok)\n" + s += " goto out;\n" + s += " for (i=0; i<%s; i++) {\n" % (parent + ty.lenvar.name) + s += libxl_C_type_gen_json(ty.elem_type, v+"[i]", + indent + " ", parent) + s += " }\n" + s += " s = yajl_gen_array_close(hand);\n" + s += " if (s != yajl_gen_status_ok)\n" + s += " goto out;\n" + s += "}\n" + elif isinstance(ty, idl.Enumeration): s += "s = libxl__yajl_gen_enum(hand, %s_to_string(%s));\n" % (ty.typename, ty.pass_arg(v, parent is None)) s += "if (s != yajl_gen_status_ok)\n" s += " goto out;\n" diff -r ac6f863df8f8 -r dc3241cf1ed1 tools/libxl/idl.py --- a/tools/libxl/idl.py Wed Apr 04 10:51:11 2012 +0100 +++ b/tools/libxl/idl.py Wed Apr 04 11:35:20 2012 +0100 @@ -251,6 +251,17 @@ string = Builtin("char *", namespace = N json_fn = "libxl__string_gen_json", autogenerate_json = False) +class Array(Type): + """An array of the same type""" + def __init__(self, elem_type, lenvar_name, **kwargs): + kwargs.setdefault('dispose_fn', 'free') + Type.__init__(self, typename=elem_type.rawname + " *", **kwargs) + + lv_kwargs = dict([(x.lstrip('lenvar_'),y) for (x,y) in kwargs.items() if x.startswith('lenvar_')]) + + self.lenvar = Field(integer, lenvar_name, **lv_kwargs) + self.elem_type = elem_type + class OrderedDict(dict): """A dictionary which remembers insertion order. diff -r ac6f863df8f8 -r dc3241cf1ed1 tools/libxl/idl.txt --- a/tools/libxl/idl.txt Wed Apr 04 10:51:11 2012 +0100 +++ b/tools/libxl/idl.txt Wed Apr 04 11:35:20 2012 +0100 @@ -145,12 +145,24 @@ idl.KeyedUnion A subclass of idl.Aggregate which represents the C union type where the currently valid member of the union can be determined based - upon another member in the containing type. + upon another member in the containing type. An idl.KeyedUnion must + always be a member of a containing idl.Aggregate type. - The KeyedUnion.keyvar contains an idl.type the member of the + The KeyedUnion.keyvar contains an idl.Type the member of the containing type which determines the valid member of the union. The must be an instance of the Enumeration type. +idl.Array + + A class representing an array or similar elements. An idl.Array must + always be an idl.Field of a containing idl.Aggregate. + + idl.Array.elem_type contains an idl.Type which is the type of all + elements of the array. + + idl.Array.len_var contains an idl.Field which is added to the parent + idl.Aggregate and will contain the length of the array. + Standard Types -------------- diff -r ac6f863df8f8 -r dc3241cf1ed1 tools/libxl/libxl.h --- a/tools/libxl/libxl.h Wed Apr 04 10:51:11 2012 +0100 +++ b/tools/libxl/libxl.h Wed Apr 04 11:35:20 2012 +0100 @@ -432,25 +432,6 @@ typedef struct { #define LIBXL_VERSION 0 -typedef struct { - libxl_domain_create_info c_info; - libxl_domain_build_info b_info; - - int num_disks, num_vifs, num_pcidevs, num_vfbs, num_vkbs; - - libxl_device_disk *disks; - libxl_device_nic *vifs; - libxl_device_pci *pcidevs; - libxl_device_vfb *vfbs; - libxl_device_vkb *vkbs; - - libxl_action_on_shutdown on_poweroff; - libxl_action_on_shutdown on_reboot; - libxl_action_on_shutdown on_watchdog; - libxl_action_on_shutdown on_crash; -} libxl_domain_config; -char *libxl_domain_config_to_json(libxl_ctx *ctx, libxl_domain_config *p); - /* context functions */ int libxl_ctx_alloc(libxl_ctx **pctx, int version, unsigned flags /* none currently defined */, @@ -462,8 +443,6 @@ int libxl_ctx_postfork(libxl_ctx *ctx); typedef int (*libxl_console_ready)(libxl_ctx *ctx, uint32_t domid, void *priv); int libxl_domain_create_new(libxl_ctx *ctx, libxl_domain_config *d_config, libxl_console_ready cb, void *priv, uint32_t *domid); int libxl_domain_create_restore(libxl_ctx *ctx, libxl_domain_config *d_config, libxl_console_ready cb, void *priv, uint32_t *domid, int restore_fd); -void libxl_domain_config_init(libxl_domain_config *d_config); -void libxl_domain_config_dispose(libxl_domain_config *d_config); int libxl_domain_suspend(libxl_ctx *ctx, libxl_domain_suspend_info *info, uint32_t domid, int fd); int libxl_domain_resume(libxl_ctx *ctx, uint32_t domid); diff -r ac6f863df8f8 -r dc3241cf1ed1 tools/libxl/libxl_create.c --- a/tools/libxl/libxl_create.c Wed Apr 04 10:51:11 2012 +0100 +++ b/tools/libxl/libxl_create.c Wed Apr 04 11:35:20 2012 +0100 @@ -22,41 +22,6 @@ #include <xc_dom.h> #include <xenguest.h> -void libxl_domain_config_init(libxl_domain_config *d_config) -{ - memset(d_config, 0, sizeof(*d_config)); - libxl_domain_create_info_init(&d_config->c_info); - libxl_domain_build_info_init(&d_config->b_info); -} - -void libxl_domain_config_dispose(libxl_domain_config *d_config) -{ - int i; - - for (i=0; i<d_config->num_disks; i++) - libxl_device_disk_dispose(&d_config->disks[i]); - free(d_config->disks); - - for (i=0; i<d_config->num_vifs; i++) - libxl_device_nic_dispose(&d_config->vifs[i]); - free(d_config->vifs); - - for (i=0; i<d_config->num_pcidevs; i++) - libxl_device_pci_dispose(&d_config->pcidevs[i]); - free(d_config->pcidevs); - - for (i=0; i<d_config->num_vfbs; i++) - libxl_device_vfb_dispose(&d_config->vfbs[i]); - free(d_config->vfbs); - - for (i=0; i<d_config->num_vkbs; i++) - libxl_device_vkb_dispose(&d_config->vkbs[i]); - free(d_config->vkbs); - - libxl_domain_create_info_dispose(&d_config->c_info); - libxl_domain_build_info_dispose(&d_config->b_info); -} - int libxl__domain_create_info_setdefault(libxl__gc *gc, libxl_domain_create_info *c_info) { diff -r ac6f863df8f8 -r dc3241cf1ed1 tools/libxl/libxl_json.c --- a/tools/libxl/libxl_json.c Wed Apr 04 10:51:11 2012 +0100 +++ b/tools/libxl/libxl_json.c Wed Apr 04 11:35:20 2012 +0100 @@ -849,158 +849,6 @@ out: return ret; } -yajl_gen_status libxl_domain_config_gen_json(yajl_gen hand, - libxl_domain_config *p) -{ - yajl_gen_status s; - int i; - - s = yajl_gen_map_open(hand); - if (s != yajl_gen_status_ok) - goto out; - - s = yajl_gen_string(hand, (const unsigned char *)"c_info", - sizeof("c_info")-1); - if (s != yajl_gen_status_ok) - goto out; - s = libxl_domain_create_info_gen_json(hand, &p->c_info); - if (s != yajl_gen_status_ok) - goto out; - - s = yajl_gen_string(hand, (const unsigned char *)"b_info", - sizeof("b_info")-1); - if (s != yajl_gen_status_ok) - goto out; - s = libxl_domain_build_info_gen_json(hand, &p->b_info); - if (s != yajl_gen_status_ok) - goto out; - - s = yajl_gen_string(hand, (const unsigned char *)"disks", - sizeof("disks")-1); - if (s != yajl_gen_status_ok) - goto out; - s = yajl_gen_array_open(hand); - if (s != yajl_gen_status_ok) - goto out; - for (i = 0; i < p->num_disks; i++) { - s = libxl_device_disk_gen_json(hand, &p->disks[i]); - if (s != yajl_gen_status_ok) - goto out; - } - s = yajl_gen_array_close(hand); - if (s != yajl_gen_status_ok) - goto out; - - s = yajl_gen_string(hand, (const unsigned char *)"vifs", - sizeof("vifs")-1); - if (s != yajl_gen_status_ok) - goto out; - s = yajl_gen_array_open(hand); - if (s != yajl_gen_status_ok) - goto out; - for (i = 0; i < p->num_vifs; i++) { - s = libxl_device_nic_gen_json(hand, &p->vifs[i]); - if (s != yajl_gen_status_ok) - goto out; - } - s = yajl_gen_array_close(hand); - if (s != yajl_gen_status_ok) - goto out; - - s = yajl_gen_string(hand, (const unsigned char *)"pcidevs", - sizeof("pcidevs")-1); - if (s != yajl_gen_status_ok) - goto out; - s = yajl_gen_array_open(hand); - if (s != yajl_gen_status_ok) - goto out; - for (i = 0; i < p->num_pcidevs; i++) { - s = libxl_device_pci_gen_json(hand, &p->pcidevs[i]); - if (s != yajl_gen_status_ok) - goto out; - } - s = yajl_gen_array_close(hand); - if (s != yajl_gen_status_ok) - goto out; - - s = yajl_gen_string(hand, (const unsigned char *)"vfbs", - sizeof("vfbs")-1); - if (s != yajl_gen_status_ok) - goto out; - s = yajl_gen_array_open(hand); - if (s != yajl_gen_status_ok) - goto out; - for (i = 0; i < p->num_vfbs; i++) { - s = libxl_device_vfb_gen_json(hand, &p->vfbs[i]); - if (s != yajl_gen_status_ok) - goto out; - } - s = yajl_gen_array_close(hand); - if (s != yajl_gen_status_ok) - goto out; - - s = yajl_gen_string(hand, (const unsigned char *)"vkbs", - sizeof("vkbs")-1); - if (s != yajl_gen_status_ok) - goto out; - s = yajl_gen_array_open(hand); - if (s != yajl_gen_status_ok) - goto out; - for (i = 0; i < p->num_vkbs; i++) { - s = libxl_device_vkb_gen_json(hand, &p->vkbs[i]); - if (s != yajl_gen_status_ok) - goto out; - } - s = yajl_gen_array_close(hand); - if (s != yajl_gen_status_ok) - goto out; - - s = yajl_gen_string(hand, (const unsigned char *)"on_poweroff", - sizeof("on_poweroff")-1); - if (s != yajl_gen_status_ok) - goto out; - s = libxl_action_on_shutdown_gen_json(hand, &p->on_poweroff); - if (s != yajl_gen_status_ok) - goto out; - - s = yajl_gen_string(hand, (const unsigned char *)"on_reboot", - sizeof("on_reboot")-1); - if (s != yajl_gen_status_ok) - goto out; - s = libxl_action_on_shutdown_gen_json(hand, &p->on_reboot); - if (s != yajl_gen_status_ok) - goto out; - - s = yajl_gen_string(hand, (const unsigned char *)"on_watchdog", - sizeof("on_watchdog")-1); - if (s != yajl_gen_status_ok) - goto out; - s = libxl_action_on_shutdown_gen_json(hand, &p->on_watchdog); - if (s != yajl_gen_status_ok) - goto out; - - s = yajl_gen_string(hand, (const unsigned char *)"on_crash", - sizeof("on_crash")-1); - if (s != yajl_gen_status_ok) - goto out; - s = libxl_action_on_shutdown_gen_json(hand, &p->on_crash); - if (s != yajl_gen_status_ok) - goto out; - - s = yajl_gen_map_close(hand); - if (s != yajl_gen_status_ok) - goto out; - out: - return s; -} - -char *libxl_domain_config_to_json(libxl_ctx *ctx, libxl_domain_config *p) -{ - return libxl__object_to_json(ctx, "libxl_domain_config", - (libxl__gen_json_callback)&libxl_domain_config_gen_json, - (void *)p); -} - /* * Local variables: * mode: C diff -r ac6f863df8f8 -r dc3241cf1ed1 tools/libxl/libxl_types.idl --- a/tools/libxl/libxl_types.idl Wed Apr 04 10:51:11 2012 +0100 +++ b/tools/libxl/libxl_types.idl Wed Apr 04 11:35:20 2012 +0100 @@ -356,6 +356,22 @@ libxl_device_pci = Struct("device_pci", ("power_mgmt", bool), ]) +libxl_domain_config = Struct("domain_config", [ + ("c_info", libxl_domain_create_info), + ("b_info", libxl_domain_build_info), + + ("disks", Array(libxl_device_disk, "num_disks")), + ("vifs", Array(libxl_device_nic, "num_vifs")), + ("pcidevs", Array(libxl_device_pci, "num_pcidevs")), + ("vfbs", Array(libxl_device_vfb, "num_vfbs")), + ("vkbs", Array(libxl_device_vkb, "num_vkbs")), + + ("on_poweroff", libxl_action_on_shutdown), + ("on_reboot", libxl_action_on_shutdown), + ("on_watchdog", libxl_action_on_shutdown), + ("on_crash", libxl_action_on_shutdown), + ]) + libxl_diskinfo = Struct("diskinfo", [ ("backend", string), ("backend_id", uint32), diff -r ac6f863df8f8 -r dc3241cf1ed1 tools/ocaml/libs/xl/genwrap.py --- a/tools/ocaml/libs/xl/genwrap.py Wed Apr 04 10:51:11 2012 +0100 +++ b/tools/ocaml/libs/xl/genwrap.py Wed Apr 04 11:35:20 2012 +0100 @@ -54,7 +54,8 @@ def ocaml_type_of(ty): return "int%d" % ty.width else: return "int" - + elif isinstance(ty,idl.Array): + return "%s list" % ocaml_type_of(ty.elem_type) elif isinstance(ty,idl.Builtin): if not builtins.has_key(ty.typename): raise NotImplementedError("Unknown Builtin %s (%s)" % (ty.typename, type(ty))) @@ -268,6 +269,7 @@ if __name__ == '__main__': "cpupoolinfo", "domain_create_info", "domain_build_info", + "domain_config", "vcpuinfo", "event", ] diff -r ac6f863df8f8 -r dc3241cf1ed1 tools/python/genwrap.py --- a/tools/python/genwrap.py Wed Apr 04 10:51:11 2012 +0100 +++ b/tools/python/genwrap.py Wed Apr 04 11:35:20 2012 +0100 @@ -4,7 +4,7 @@ import sys,os import idl -(TYPE_DEFBOOL, TYPE_BOOL, TYPE_INT, TYPE_UINT, TYPE_STRING, TYPE_AGGREGATE) = range(6) +(TYPE_DEFBOOL, TYPE_BOOL, TYPE_INT, TYPE_UINT, TYPE_STRING, TYPE_ARRAY, TYPE_AGGREGATE) = range(7) def py_type(ty): if ty == idl.bool: @@ -18,6 +18,8 @@ def py_type(ty): return TYPE_INT else: return TYPE_UINT + if isinstance(ty, idl.Array): + return TYPE_ARRAY if isinstance(ty, idl.Aggregate): return TYPE_AGGREGATE if ty == idl.string: @@ -74,7 +76,7 @@ def py_attrib_get(ty, f): l.append(' return genwrap__ull_get(self->obj.%s);'%f.name) elif t == TYPE_STRING: l.append(' return genwrap__string_get(&self->obj.%s);'%f.name) - elif t == TYPE_AGGREGATE: + elif t == TYPE_AGGREGATE or t == TYPE_ARRAY: l.append(' PyErr_SetString(PyExc_NotImplementedError, "Getting %s");'%ty.typename) l.append(' return NULL;') else: @@ -105,7 +107,7 @@ def py_attrib_set(ty, f): l.append(' return ret;') elif t == TYPE_STRING: l.append(' return genwrap__string_set(v, &self->obj.%s);'%f.name) - elif t == TYPE_AGGREGATE: + elif t == TYPE_AGGREGATE or t == TYPE_ARRAY: l.append(' PyErr_SetString(PyExc_NotImplementedError, "Setting %s");'%ty.typename) l.append(' return -1;') else: _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |