[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] libxl: autogenerate libxl_FOO_init and libxl_FOO_init_FIELD
# HG changeset patch # User Ian Campbell <ian.campbell@xxxxxxxxxx> # Date 1330604775 0 # Node ID 17bfd4d2ffce56b65e7849a5779471ef4f5e4aea # Parent aa30f4cfde89eba61ee43fe3a15c1823d5880cad libxl: autogenerate libxl_FOO_init and libxl_FOO_init_FIELD Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- diff -r aa30f4cfde89 -r 17bfd4d2ffce tools/libxl/gentypes.py --- a/tools/libxl/gentypes.py Thu Mar 01 12:26:15 2012 +0000 +++ b/tools/libxl/gentypes.py Thu Mar 01 12:26:15 2012 +0000 @@ -78,6 +78,88 @@ s = indent + s return s.replace("\n", "\n%s" % indent).rstrip(indent) +def libxl_init_members(ty, nesting = 0): + """Returns a list of members of ty which require a separate init""" + + if isinstance(ty, idl.Aggregate): + return [f for f in ty.fields if not f.const and isinstance(f.type,idl.KeyedUnion)] + else: + return [] + +def _libxl_C_type_init(ty, v, indent = " ", parent = None, subinit=False): + s = "" + if isinstance(ty, idl.KeyedUnion): + if parent is None: + raise Exception("KeyedUnion type must have a parent") + if subinit: + s += "switch (%s) {\n" % (parent + ty.keyvar.name) + for f in ty.fields: + (nparent,fexpr) = ty.member(v, f, parent is None) + s += "case %s:\n" % f.enumname + s += _libxl_C_type_init(f.type, fexpr, " ", nparent) + s += " break;\n" + s += "}\n" + else: + if ty.keyvar.init_val: + s += "%s = %s;\n" % (parent + ty.keyvar.name, ty.keyvar.init_val) + elif ty.keyvar.type.init_val: + s += "%s = %s;\n" % (parent + ty.keyvar.name, ty.keyvar.type.init_val) + elif isinstance(ty, idl.Struct) and (parent is None or ty.init_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) + if f.init_val is not None: + s += "%s = %s;\n" % (fexpr, f.init_val) + else: + s += _libxl_C_type_init(f.type, fexpr, "", nparent) + else: + if ty.init_val is not None: + s += "%s = %s;\n" % (ty.pass_arg(v, parent is None), ty.init_val) + elif ty.init_fn is not None: + s += "%s(%s);\n" % (ty.init_fn, ty.pass_arg(v, parent is None)) + + if s != "": + s = indent + s + return s.replace("\n", "\n%s" % indent).rstrip(indent) + +def libxl_C_type_init(ty): + s = "" + s += "void %s(%s)\n" % (ty.init_fn, ty.make_arg("p", passby=idl.PASS_BY_REFERENCE)) + s += "{\n" + s += " memset(p, '\\0', sizeof(*p));\n" + s += _libxl_C_type_init(ty, "p") + s += "}\n" + s += "\n" + return s + +def libxl_C_type_member_init(ty, field): + if not isinstance(field.type, idl.KeyedUnion): + raise Exception("Only KeyedUnion is supported for member init") + + ku = field.type + + s = "" + s += "void %s(%s, %s)\n" % (ty.init_fn + "_" + ku.keyvar.name, + ty.make_arg("p", passby=idl.PASS_BY_REFERENCE), + ku.keyvar.type.make_arg(ku.keyvar.name)) + s += "{\n" + + if ku.keyvar.init_val: + init_val = ku.keyvar.init_val + elif ku.keyvar.type.init_val: + init_val = ku.keyvar.type.init_val + else: + init_val = None + + if init_val is not None: + (nparent,fexpr) = ty.member(ty.pass_arg("p"), ku.keyvar, isref=True) + s += " assert(%s == %s);\n" % (fexpr, init_val) + s += " %s = %s;\n" % (fexpr, ku.keyvar.name) + (nparent,fexpr) = ty.member(ty.pass_arg("p"), field, isref=True) + s += _libxl_C_type_init(ku, fexpr, parent=nparent, subinit=True) + s += "}\n" + s += "\n" + return s + def libxl_C_type_gen_json(ty, v, indent = " ", parent = None): s = "" if parent is None: @@ -199,6 +281,15 @@ f.write(libxl_C_type_define(ty) + ";\n") if ty.dispose_fn is not None: f.write("void %s(%s);\n" % (ty.dispose_fn, ty.make_arg("p"))) + if ty.init_fn is not None: + f.write("void %s(%s);\n" % (ty.init_fn, ty.make_arg("p"))) + for field in libxl_init_members(ty): + if not isinstance(field.type, idl.KeyedUnion): + raise Exception("Only KeyedUnion is supported for member init") + ku = field.type + f.write("void %s(%s, %s);\n" % (ty.init_fn + "_" + ku.keyvar.name, + ty.make_arg("p"), + ku.keyvar.type.make_arg(ku.keyvar.name))) if ty.json_fn is not None: f.write("char *%s_to_json(libxl_ctx *ctx, %s);\n" % (ty.typename, ty.make_arg("p"))) if isinstance(ty, idl.Enumeration): @@ -227,7 +318,7 @@ """ % (header_json_define, header_json_define, " ".join(sys.argv))) - for ty in [ty for ty in types+builtins if ty.json_fn is not None]: + for ty in [ty for ty in types if ty.json_fn is not None]: f.write("yajl_gen_status %s_gen_json(yajl_gen hand, %s);\n" % (ty.typename, ty.make_arg("p", passby=idl.PASS_BY_REFERENCE))) f.write("\n") @@ -264,6 +355,11 @@ f.write(" memset(p, LIBXL_DTOR_POISON, sizeof(*p));\n") f.write("}\n") f.write("\n") + + for ty in [t for t in types if t.init_fn is not None and t.autogenerate_init_fn]: + f.write(libxl_C_type_init(ty)) + for field in libxl_init_members(ty): + f.write(libxl_C_type_member_init(ty, field)) for ty in [t for t in types if isinstance(t,idl.Enumeration)]: f.write("const char *%s_to_string(%s e)\n" % (ty.typename, ty.typename)) diff -r aa30f4cfde89 -r 17bfd4d2ffce tools/libxl/idl.py --- a/tools/libxl/idl.py Thu Mar 01 12:26:15 2012 +0000 +++ b/tools/libxl/idl.py Thu Mar 01 12:26:15 2012 +0000 @@ -51,6 +51,10 @@ self.autogenerate_dispose_fn = kwargs.setdefault('autogenerate_dispose_fn', True) + self.init_fn = kwargs.setdefault('init_fn', None) + self.init_val = kwargs.setdefault('init_val', None) + self.autogenerate_init_fn = kwargs.setdefault('autogenerate_init_fn', False) + if self.typename is not None and not self.private: self.json_fn = kwargs.setdefault('json_fn', self.typename + "_gen_json") else: @@ -144,12 +148,20 @@ self.name = name self.const = kwargs.setdefault('const', False) self.enumname = kwargs.setdefault('enumname', None) + self.init_val = kwargs.setdefault('init_val', None) class Aggregate(Type): """A type containing a collection of other types""" def __init__(self, kind, typename, fields, **kwargs): Type.__init__(self, typename, **kwargs) + if self.typename is not None: + self.init_fn = kwargs.setdefault('init_fn', self.typename + "_init") + else: + self.init_fn = kwargs.setdefault('init_fn', None) + + self.autogenerate_init_fn = kwargs.setdefault('autogenerate_init_fn', True) + self.kind = kind self.fields = [] diff -r aa30f4cfde89 -r 17bfd4d2ffce tools/libxl/idl.txt --- a/tools/libxl/idl.txt Thu Mar 01 12:26:15 2012 +0000 +++ b/tools/libxl/idl.txt Thu Mar 01 12:26:15 2012 +0000 @@ -44,6 +44,22 @@ Indicates if the above named Type.dispose_fn should be autogenerated. +Type.init_val: (default: None) + + C expression for the value to initialise instances of this type to. + + If present takes precendence over init_fn (see below). + +Type.init_fn: (default: typename + "_init" if dir in [IN, BOTH] and + type != None) + + The name of the C function which will initialist Type. + +Type.autogenerate_init_fn: (default: True if dir in [IN, BOTH]) + + Indicates if the above named Type.init_fn should be + autogenerated. + Type.json_fn: (default: typename + "_gen_json" or None if type == None) The name of the C function which will generate a YAJL data structure @@ -105,10 +121,13 @@ Each field has the following properties: - Field.type The type of the member (a idl.Type). - Field.name The name of the member (can be None for anonymous - fields). - Field.const Boolean, true if the member is const. + Field.type The type of the member (a idl.Type). + Field.name The name of the member (can be None for anonymous + fields). + Field.const Boolean, true if the member is const. + Field.init_val The initialisation value for this field. Takes + precendence over both Field.type.init_val and + Field.type.init_fn. idl.Struct diff -r aa30f4cfde89 -r 17bfd4d2ffce tools/libxl/libxl.c --- a/tools/libxl/libxl.c Thu Mar 01 12:26:15 2012 +0000 +++ b/tools/libxl/libxl.c Thu Mar 01 12:26:15 2012 +0000 @@ -1227,11 +1227,6 @@ /******************************************************************************/ -void libxl_device_disk_init(libxl_device_disk *disk) -{ - memset(disk, 0x00, sizeof(libxl_device_disk)); -} - int libxl__device_disk_setdefault(libxl__gc *gc, libxl_device_disk *disk) { int rc; @@ -1718,10 +1713,6 @@ } /******************************************************************************/ -void libxl_device_nic_init(libxl_device_nic *nic) -{ - memset(nic, '\0', sizeof(*nic)); -} int libxl__device_nic_setdefault(libxl__gc *gc, libxl_device_nic *nic) { @@ -2142,10 +2133,6 @@ } /******************************************************************************/ -void libxl_device_vkb_init(libxl_device_vkb *vkb) -{ - memset(vkb, 0x00, sizeof(libxl_device_vkb)); -} int libxl__device_vkb_setdefault(libxl__gc *gc, libxl_device_vkb *vkb) { @@ -2254,10 +2241,6 @@ } /******************************************************************************/ -void libxl_device_vfb_init(libxl_device_vfb *vfb) -{ - memset(vfb, 0x00, sizeof(libxl_device_vfb)); -} int libxl__device_vfb_setdefault(libxl__gc *gc, libxl_device_vfb *vfb) { @@ -3067,6 +3050,8 @@ struct xen_domctl_sched_credit sdom; int rc; + libxl_sched_credit_domain_init(scinfo); + rc = xc_sched_credit_domain_get(ctx->xch, domid, &sdom); if (rc != 0) { LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting domain sched credit"); @@ -3126,6 +3111,8 @@ struct xen_domctl_sched_credit2 sdom; int rc; + libxl_sched_credit2_domain_init(scinfo); + rc = xc_sched_credit2_domain_get(ctx->xch, domid, &sdom); if (rc != 0) { LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, @@ -3183,6 +3170,8 @@ uint16_t weight; int rc; + libxl_sched_sedf_domain_init(scinfo); + rc = xc_sedf_domain_get(ctx->xch, domid, &period, &slice, &latency, &extratime, &weight); if (rc != 0) { diff -r aa30f4cfde89 -r 17bfd4d2ffce tools/libxl/libxl.h --- a/tools/libxl/libxl.h Thu Mar 01 12:26:15 2012 +0000 +++ b/tools/libxl/libxl.h Thu Mar 01 12:26:15 2012 +0000 @@ -381,10 +381,6 @@ int libxl_ctx_postfork(libxl_ctx *ctx); /* domain related functions */ -void libxl_domain_create_info_init(libxl_domain_create_info *c_info); -void libxl_domain_build_info_init(libxl_domain_build_info *b_info); -void libxl_domain_build_info_init_type(libxl_domain_build_info *b_info, - libxl_domain_type type); 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); @@ -523,7 +519,6 @@ */ /* Disks */ -void libxl_device_disk_init(libxl_device_disk *disk); int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk); int libxl_device_disk_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk, @@ -549,7 +544,6 @@ int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk *disk); /* Network Interfaces */ -void libxl_device_nic_init(libxl_device_nic *nic); int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic); int libxl_device_nic_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic, @@ -561,7 +555,6 @@ libxl_device_nic *nic, libxl_nicinfo *nicinfo); /* Keyboard */ -void libxl_device_vkb_init(libxl_device_vkb *vkb); int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb); int libxl_device_vkb_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb, @@ -569,7 +562,6 @@ int libxl_device_vkb_destroy(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb); /* Framebuffer */ -void libxl_device_vfb_init(libxl_device_vfb *vfb); int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb); int libxl_device_vfb_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb, @@ -577,7 +569,6 @@ int libxl_device_vfb_destroy(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb); /* PCI Passthrough */ -void libxl_device_pci_init(libxl_device_pci *pci); int libxl_device_pci_add(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev); int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev); int libxl_device_pci_destroy(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev); diff -r aa30f4cfde89 -r 17bfd4d2ffce tools/libxl/libxl_create.c --- a/tools/libxl/libxl_create.c Thu Mar 01 12:26:15 2012 +0000 +++ b/tools/libxl/libxl_create.c Thu Mar 01 12:26:15 2012 +0000 @@ -50,11 +50,6 @@ libxl_domain_build_info_dispose(&d_config->b_info); } -void libxl_domain_create_info_init(libxl_domain_create_info *c_info) -{ - memset(c_info, '\0', sizeof(*c_info)); -} - int libxl__domain_create_info_setdefault(libxl__gc *gc, libxl_domain_create_info *c_info) { @@ -69,35 +64,6 @@ return 0; } -void libxl_domain_build_info_init(libxl_domain_build_info *b_info) -{ - memset(b_info, '\0', sizeof(*b_info)); - b_info->type = -1; - - b_info->max_memkb = LIBXL_MEMKB_DEFAULT; - b_info->target_memkb = LIBXL_MEMKB_DEFAULT; - b_info->shadow_memkb = LIBXL_MEMKB_DEFAULT; - b_info->video_memkb = LIBXL_MEMKB_DEFAULT; - -} - -void libxl_domain_build_info_init_type(libxl_domain_build_info *b_info, - libxl_domain_type type) -{ - assert(b_info->type == -1); - b_info->type = type; - switch (b_info->type) { - case LIBXL_DOMAIN_TYPE_HVM: - b_info->u.hvm.timer_mode = LIBXL_TIMER_MODE_DEFAULT; - break; - case LIBXL_DOMAIN_TYPE_PV: - b_info->u.pv.slack_memkb = LIBXL_MEMKB_DEFAULT; - break; - default: - abort(); - } -} - int libxl__domain_build_info_setdefault(libxl__gc *gc, libxl_domain_build_info *b_info) { diff -r aa30f4cfde89 -r 17bfd4d2ffce tools/libxl/libxl_json.h --- a/tools/libxl/libxl_json.h Thu Mar 01 12:26:15 2012 +0000 +++ b/tools/libxl/libxl_json.h Thu Mar 01 12:26:15 2012 +0000 @@ -22,6 +22,20 @@ # include <yajl/yajl_version.h> #endif +yajl_gen_status libxl_defbool_gen_json(yajl_gen hand, libxl_defbool *p); +yajl_gen_status libxl_domid_gen_json(yajl_gen hand, libxl_domid *p); +yajl_gen_status libxl_uuid_gen_json(yajl_gen hand, libxl_uuid *p); +yajl_gen_status libxl_mac_gen_json(yajl_gen hand, libxl_mac *p); +yajl_gen_status libxl_cpumap_gen_json(yajl_gen hand, libxl_cpumap *p); +yajl_gen_status libxl_cpuid_policy_list_gen_json(yajl_gen hand, + libxl_cpuid_policy_list *p); +yajl_gen_status libxl_string_list_gen_json(yajl_gen hand, libxl_string_list *p); +yajl_gen_status libxl_key_value_list_gen_json(yajl_gen hand, + libxl_key_value_list *p); +yajl_gen_status libxl_file_reference_gen_json(yajl_gen hand, + libxl_file_reference *p); +yajl_gen_status libxl_hwcap_gen_json(yajl_gen hand, libxl_hwcap *p); + #include <_libxl_types_json.h> /* YAJL version check */ diff -r aa30f4cfde89 -r 17bfd4d2ffce tools/libxl/libxl_pci.c --- a/tools/libxl/libxl_pci.c Thu Mar 01 12:26:15 2012 +0000 +++ b/tools/libxl/libxl_pci.c Thu Mar 01 12:26:15 2012 +0000 @@ -765,11 +765,6 @@ return -1; } -void libxl_device_pci_init(libxl_device_pci *pci) -{ - memset(pci, '\0', sizeof(*pci)); -} - int libxl__device_pci_setdefault(libxl__gc *gc, libxl_device_pci *pci) { return 0; diff -r aa30f4cfde89 -r 17bfd4d2ffce tools/libxl/libxl_types.idl --- a/tools/libxl/libxl_types.idl Thu Mar 01 12:26:15 2012 +0000 +++ b/tools/libxl/libxl_types.idl Thu Mar 01 12:26:15 2012 +0000 @@ -100,7 +100,7 @@ (1, "no_delay_for_missed_ticks"), (2, "no_missed_ticks_pending"), (3, "one_missed_tick_pending"), - ]) + ], init_val = "LIBXL_TIMER_MODE_DEFAULT") libxl_bios_type = Enumeration("bios_type", [ (1, "rombios"), @@ -180,19 +180,19 @@ ("vcpu_max_id", uint32), ("vcpu_online", uint32), ("cpupool", uint32), - ]) + ], dir=DIR_OUT) libxl_cpupoolinfo = Struct("cpupoolinfo", [ ("poolid", uint32), ("sched", libxl_scheduler), ("n_dom", uint32), ("cpumap", libxl_cpumap) - ]) + ], dir=DIR_OUT) libxl_vminfo = Struct("vminfo", [ ("uuid", libxl_uuid), ("domid", libxl_domid), - ]) + ], dir=DIR_OUT) libxl_version_info = Struct("version_info", [ ("xen_version_major", integer), @@ -207,7 +207,7 @@ ("virt_start", uint64), ("pagesize", integer), ("commandline", string), - ]) + ], dir=DIR_OUT) libxl_domain_create_info = Struct("domain_create_info",[ ("type", libxl_domain_type), @@ -219,7 +219,9 @@ ("xsdata", libxl_key_value_list), ("platformdata", libxl_key_value_list), ("poolid", uint32), - ]) + ], dir=DIR_IN) + +MemKB = UInt(64, init_val = "LIBXL_MEMKB_DEFAULT") # Instances of libxl_file_reference contained in this struct which # have been mapped (with libxl_file_reference_map) will be unmapped @@ -297,8 +299,8 @@ # Use host's E820 for PCI passthrough. ("e820_host", libxl_defbool), ])), - ])), - ], + ], keyvar_init_val = "-1")), + ], dir=DIR_IN ) libxl_device_vfb = Struct("device_vfb", [ @@ -360,7 +362,7 @@ ("state", integer), ("evtch", integer), ("rref", integer), - ]) + ], dir=DIR_OUT) libxl_nicinfo = Struct("nicinfo", [ ("backend", string), @@ -372,7 +374,7 @@ ("evtch", integer), ("rref_tx", integer), ("rref_rx", integer), - ]) + ], dir=DIR_OUT) libxl_vcpuinfo = Struct("vcpuinfo", [ ("vcpuid", uint32), @@ -382,7 +384,7 @@ ("running", bool), ("vcpu_time", uint64), # total vcpu time ran (ns) ("cpumap", libxl_cpumap), # current cpu's affinities - ]) + ], dir=DIR_OUT) libxl_physinfo = Struct("physinfo", [ ("threads_per_core", uint32), @@ -409,7 +411,7 @@ ("core", uint32), ("socket", uint32), ("node", uint32), - ]) + ], dir=DIR_OUT) libxl_sched_credit_domain = Struct("sched_credit_domain", [ ("weight", integer), diff -r aa30f4cfde89 -r 17bfd4d2ffce tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Thu Mar 01 12:26:15 2012 +0000 +++ b/tools/libxl/xl_cmdimpl.c Thu Mar 01 12:26:15 2012 +0000 @@ -3922,6 +3922,7 @@ { int rc; + rc = libxl_sched_credit_domain_set(ctx, domid, scinfo); if (rc) fprintf(stderr, "libxl_sched_credit_domain_set failed.\n"); @@ -3950,6 +3951,7 @@ scinfo.weight, scinfo.cap); free(domname); + libxl_sched_credit_domain_dispose(&scinfo); return 0; } @@ -3997,6 +3999,7 @@ domid, scinfo.weight); free(domname); + libxl_sched_credit2_domain_dispose(&scinfo); return 0; } @@ -4020,7 +4023,6 @@ rc = libxl_sched_sedf_domain_set(ctx, domid, scinfo); if (rc) fprintf(stderr, "libxl_sched_sedf_domain_set failed.\n"); - return rc; } @@ -4049,6 +4051,7 @@ scinfo.extratime, scinfo.weight); free(domname); + libxl_sched_sedf_domain_dispose(&scinfo); return 0; } @@ -4181,6 +4184,7 @@ if (opt_c) scinfo.cap = cap; rc = sched_credit_domain_set(domid, &scinfo); + libxl_sched_credit_domain_dispose(&scinfo); if (rc) return -rc; } @@ -4255,6 +4259,7 @@ if (opt_w) scinfo.weight = weight; rc = sched_credit2_domain_set(domid, &scinfo); + libxl_sched_credit2_domain_dispose(&scinfo); if (rc) return -rc; } @@ -4373,6 +4378,7 @@ scinfo.slice = 0; } rc = sched_sedf_domain_set(domid, &scinfo); + libxl_sched_sedf_domain_dispose(&scinfo); if (rc) return -rc; } _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |