[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 24 of 32 RFC] libxl: add new "defbool" built in type
# HG changeset patch # User Ian Campbell <ian.campbell@xxxxxxxxxx> # Date 1326470399 0 # Node ID 7e9f3ce2cd1f05ae30727bed05f295c7fdfbb2ea # Parent 0d3abdb6c01894e4e07400317a0b49433dbaf1a5 libxl: add new "defbool" built in type. This type is a but like a "boolean" but with a third state "default" (so really I suppose its a tristate). Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> diff -r 0d3abdb6c018 -r 7e9f3ce2cd1f tools/libxl/gentest.py --- a/tools/libxl/gentest.py Thu Jan 12 17:11:49 2012 +0000 +++ b/tools/libxl/gentest.py Fri Jan 13 15:59:59 2012 +0000 @@ -19,7 +19,8 @@ def randomize_case(s): def randomize_enum(e): return random.choice([v.name for v in e.values]) -handcoded = ["libxl_cpumap", "libxl_key_value_list", +handcoded = ["libxl_defbool", # Temp until a user appears in the next patch + "libxl_cpumap", "libxl_key_value_list", "libxl_cpuid_policy_list", "libxl_file_reference", "libxl_string_list", "libxl_cpuarray"] @@ -54,6 +55,8 @@ def gen_rand_init(ty, v, indent = " " ty.pass_arg(v, parent is None)) elif ty.typename in ["bool"]: s += "%s = rand() %% 2;\n" % v + elif ty.typename in ["libxl_defbool"]: + s += "libxl_defbool_set(%s, !!rand() %% 1);\n" % v elif ty.typename in ["char *"]: s += "%s = rand_str();\n" % v elif ty.private: diff -r 0d3abdb6c018 -r 7e9f3ce2cd1f tools/libxl/libxl.c --- a/tools/libxl/libxl.c Thu Jan 12 17:11:49 2012 +0000 +++ b/tools/libxl/libxl.c Fri Jan 13 15:59:59 2012 +0000 @@ -126,6 +126,47 @@ void libxl_key_value_list_dispose(libxl_ free(kvl); } +#define LIBXL__DEFBOOL_DEFAULT (0) +#define LIBXL__DEFBOOL_FALSE (-1) +#define LIBXL__DEFBOOL_TRUE (1) + +void libxl_defbool_set(libxl_defbool *db, bool b) +{ + db->val = b ? LIBXL__DEFBOOL_TRUE : LIBXL__DEFBOOL_FALSE; +} + +void libxl_defbool_unset(libxl_defbool *db) +{ + db->val = LIBXL__DEFBOOL_DEFAULT; +} + +bool libxl_defbool_is_default(libxl_defbool db) +{ + return !db.val; +} + +void libxl_defbool_setdefault(libxl_defbool *db, bool b) +{ + if (libxl_defbool_is_default(*db)) + libxl_defbool_set(db, b); +} + +bool libxl_defbool_val(libxl_defbool db) +{ + assert(!libxl_defbool_is_default(db)); + return db.val > 0; +} + +const char *libxl_defbool_to_string(libxl_defbool b) +{ + if (b.val < 0) + return "False"; + else if (b.val > 0) + return "True"; + else + return "<default>"; +} + /******************************************************************************/ diff -r 0d3abdb6c018 -r 7e9f3ce2cd1f tools/libxl/libxl.h --- a/tools/libxl/libxl.h Thu Jan 12 17:11:49 2012 +0000 +++ b/tools/libxl/libxl.h Fri Jan 13 15:59:59 2012 +0000 @@ -199,6 +199,30 @@ typedef struct { int v; } libxl_enum_string_table; +/* + * A boolean variable with an explicit default state. + * + * Users should treat this struct as opaque and use the following + * defined macros and accessor functions. + * + * To allow users of the library to naively select all defaults this + * state is represented as 0. False is < 0 and True is > 0. + */ +typedef struct { + int val; +} libxl_defbool; + +void libxl_defbool_set(libxl_defbool *db, bool b); +/* Resets to default */ +void libxl_defbool_unset(libxl_defbool *db); +/* Sets db only if it is currently == default */ +void libxl_defbool_setdefault(libxl_defbool *db, bool b); +bool libxl_defbool_is_default(libxl_defbool db); +/* db must not be == default */ +bool libxl_defbool_val(libxl_defbool db); + +const char *libxl_defbool_to_string(libxl_defbool b); + typedef struct libxl__ctx libxl_ctx; #include "_libxl_types.h" diff -r 0d3abdb6c018 -r 7e9f3ce2cd1f tools/libxl/libxl_json.c --- a/tools/libxl/libxl_json.c Thu Jan 12 17:11:49 2012 +0000 +++ b/tools/libxl/libxl_json.c Fri Jan 13 15:59:59 2012 +0000 @@ -87,6 +87,12 @@ yajl_gen_status libxl__yajl_gen_enum(yaj /* * YAJL generators for builtin libxl types. */ +yajl_gen_status libxl_defbool_gen_json(yajl_gen hand, + libxl_defbool *db) +{ + return libxl__yajl_gen_asciiz(hand, libxl_defbool_to_string(*db)); +} + yajl_gen_status libxl_uuid_gen_json(yajl_gen hand, libxl_uuid *uuid) { diff -r 0d3abdb6c018 -r 7e9f3ce2cd1f tools/libxl/libxl_types.idl --- a/tools/libxl/libxl_types.idl Thu Jan 12 17:11:49 2012 +0000 +++ b/tools/libxl/libxl_types.idl Fri Jan 13 15:59:59 2012 +0000 @@ -5,6 +5,8 @@ namespace("libxl_") +libxl_defbool = Builtin("defbool", passby=PASS_BY_REFERENCE) + libxl_domid = Builtin("domid", json_fn = "yajl_gen_integer", autogenerate_json = False) libxl_uuid = Builtin("uuid", passby=PASS_BY_REFERENCE) libxl_mac = Builtin("mac", passby=PASS_BY_REFERENCE) diff -r 0d3abdb6c018 -r 7e9f3ce2cd1f tools/libxl/libxlu_cfg.c --- a/tools/libxl/libxlu_cfg.c Thu Jan 12 17:11:49 2012 +0000 +++ b/tools/libxl/libxlu_cfg.c Fri Jan 13 15:59:59 2012 +0000 @@ -235,6 +235,17 @@ int xlu_cfg_get_long(const XLU_Config *c return 0; } +int xlu_cfg_get_defbool(const XLU_Config *cfg, const char *n, libxl_defbool *b, + int dont_warn) +{ + int ret; + long l; + + ret = xlu_cfg_get_long(cfg, n, &l, dont_warn); + if (ret) return ret; + libxl_defbool_set(b, !!l); + return 0; +} int xlu_cfg_get_list(const XLU_Config *cfg, const char *n, XLU_ConfigList **list_r, int *entries_r, int dont_warn) { diff -r 0d3abdb6c018 -r 7e9f3ce2cd1f tools/libxl/libxlutil.h --- a/tools/libxl/libxlutil.h Thu Jan 12 17:11:49 2012 +0000 +++ b/tools/libxl/libxlutil.h Fri Jan 13 15:59:59 2012 +0000 @@ -52,6 +52,8 @@ int xlu_cfg_replace_string(const XLU_Con char **value_r, int dont_warn); int xlu_cfg_get_long(const XLU_Config*, const char *n, long *value_r, int dont_warn); +int xlu_cfg_get_defbool(const XLU_Config*, const char *n, libxl_defbool *b, + int dont_warn); int xlu_cfg_get_list(const XLU_Config*, const char *n, XLU_ConfigList **list_r /* may be 0 */, _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |