xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Anthony PERARD <anthony.perard@citrix.com>
To: Wei Liu <wei.liu2@citrix.com>
Cc: ian.jackson@eu.citrix.com, Ian Campbell <Ian.Campbell@citrix.com>,
	xen-devel@lists.xen.org
Subject: Re: [PATCH V4 09/24] libxl_json: introduce parser functions for builtin types
Date: Tue, 6 May 2014 15:35:27 +0100	[thread overview]
Message-ID: <20140506143527.GH3530@perard.uk.xensource.com> (raw)
In-Reply-To: <20140506140420.GI17067@zion.uk.xensource.com>

On Tue, May 06, 2014 at 03:04:20PM +0100, Wei Liu wrote:
> On Tue, May 06, 2014 at 02:57:13PM +0100, Anthony PERARD wrote:
> > On Tue, May 06, 2014 at 01:57:38PM +0100, Ian Campbell wrote:
> > > On Thu, 2014-05-01 at 13:58 +0100, Wei Liu wrote:
> > > 
> > > Anthony, are you OK with this one now?
> > 
> > Well, I think I commented the V3 just after the V4 was sent, so every
> > comments still applies.
> > 
> 
> I have this one in queue:
> 
> 
> From 28f45d7e0edd26187285d4c3dea507776f2523d7 Mon Sep 17 00:00:00 2001
> From: Wei Liu <wei.liu2@citrix.com>
> Date: Tue, 8 Apr 2014 15:27:04 +0100
> Subject: [PATCH] libxl_json: introduce parser functions for builtin types
> 
> This changeset introduces following functions:
>  * libxl_defbool_parse_json
>  * libxl__bool_parse_json
>  * libxl_uuid_parse_json
>  * libxl_mac_parse_json
>  * libxl_bitmap_parse_json
>  * libxl_cpuid_policy_list_parse_json
>  * libxl_string_list_parse_json
>  * libxl_key_value_list_parse_json
>  * libxl_hwcap_parse_json
>  * libxl__int_parse_json
>  * libxl__uint{8,16,32,64}_parse_json
>  * libxl__string_parse_json
> 
> They will be used in later patch to convert the libxl__json_object
> tree of a builtin type to libxl_FOO struct.
> 
> Also remove delcaration of libxl_domid_gen_json as libxl_domid uses
> yajl_gen_integer to generate JSON object.
> 
> Signed-off-by: Wei Liu <wei.liu2@citrix.com>
> Cc: Anthony Perard <anthony.perard@citrix.com>
> ---
>  tools/libxl/libxl_cpuid.c   |   89 +++++++++++++---
>  tools/libxl/libxl_json.c    |  239 +++++++++++++++++++++++++++++++++++++++++++
>  tools/libxl/libxl_json.h    |   36 ++++++-
>  tools/libxl/libxl_nocpuid.c |    7 ++
>  4 files changed, 354 insertions(+), 17 deletions(-)
> 
> diff --git a/tools/libxl/libxl_cpuid.c b/tools/libxl/libxl_cpuid.c
> index 8a59c4d..7ac5b74 100644
> --- a/tools/libxl/libxl_cpuid.c
> +++ b/tools/libxl/libxl_cpuid.c
> @@ -337,29 +337,29 @@ void libxl_cpuid_set(libxl_ctx *ctx, uint32_t domid,
>                       (const char**)(cpuid[i].policy), cpuid_res);
>  }
>  
> +static const char *input_names[2] = { "leaf", "subleaf" };
> +static const char *policy_names[4] = { "eax", "ebx", "ecx", "edx" };
> +/*
> + * Aiming for:
> + * [
> + *     { 'leaf':    'val-eax',
> + *       'subleaf': 'val-ecx',
> + *       'eax':     'filter',
> + *       'ebx':     'filter',
> + *       'ecx':     'filter',
> + *       'edx':     'filter' },
> + *     { 'leaf':    'val-eax', ..., 'eax': 'filter', ... },
> + *     ... etc ...
> + * ]
> + */
> +
>  yajl_gen_status libxl_cpuid_policy_list_gen_json(yajl_gen hand,
>                                  libxl_cpuid_policy_list *pcpuid)
>  {
>      libxl_cpuid_policy_list cpuid = *pcpuid;
>      yajl_gen_status s;
> -    const char *input_names[2] = { "leaf", "subleaf" };
> -    const char *policy_names[4] = { "eax", "ebx", "ecx", "edx" };
>      int i, j;
>  
> -    /*
> -     * Aiming for:
> -     * [
> -     *     { 'leaf':    'val-eax',
> -     *       'subleaf': 'val-ecx',
> -     *       'eax':     'filter',
> -     *       'ebx':     'filter',
> -     *       'ecx':     'filter',
> -     *       'edx':     'filter' },
> -     *     { 'leaf':    'val-eax', ..., 'eax': 'filter', ... },
> -     *     ... etc ...
> -     * ]
> -     */
> -
>      s = yajl_gen_array_open(hand);
>      if (s != yajl_gen_status_ok) goto out;
>  
> @@ -397,6 +397,63 @@ out:
>      return s;
>  }
>  
> +int libxl_cpuid_policy_list_parse_json(libxl__gc *gc,
> +                                       const libxl__json_object *o,
> +                                       libxl_cpuid_policy_list *p)
> +{
> +    int i, size;
> +    libxl_cpuid_policy_list l;
> +    flexarray_t *array;
> +
> +    if (!libxl__json_object_is_array(o))
> +        return ERROR_FAIL;
> +
> +    array = libxl__json_object_get_array(o);
> +    if (!array->count)
> +        return 0;
> +
> +    size = array->count;
> +    /* need one extra slot as sentinel */
> +    l = *p = libxl__calloc(NOGC, size + 1, sizeof(libxl_cpuid_policy));
> +
> +    l[size].input[0] = XEN_CPUID_INPUT_UNUSED;
> +    l[size].input[1] = XEN_CPUID_INPUT_UNUSED;
> +
> +    for (i = 0; i < size; i++) {
> +        const libxl__json_object *t;
> +        int j;
> +
> +        if (flexarray_get(array, i, (void**)&t) != 0)
> +            return ERROR_FAIL;
> +
> +        if (!libxl__json_object_is_map(t))
> +            return ERROR_FAIL;
> +
> +        for (j = 0; j < ARRAY_SIZE(l[0].input); j++) {
> +            const libxl__json_object *r;
> +
> +            r = libxl__json_map_get(input_names[j], t, JSON_INTEGER);
> +            if (!r)
> +                l[i].input[j] = XEN_CPUID_INPUT_UNUSED;
> +            else
> +                l[i].input[j] = libxl__json_object_get_integer(r);
> +        }
> +
> +        for (j = 0; j < ARRAY_SIZE(l[0].policy); j++) {
> +            const libxl__json_object *r;
> +
> +            r = libxl__json_map_get(policy_names[j], t, JSON_STRING);
> +            if (!r)
> +                l[i].policy[j] = NULL;
> +            else
> +                l[i].policy[j] =
> +                    libxl__strdup(NOGC, libxl__json_object_get_string(r));
> +        }
> +    }
> +
> +    return 0;
> +}
> +
>  /*
>   * Local variables:
>   * mode: C
> diff --git a/tools/libxl/libxl_json.c b/tools/libxl/libxl_json.c
> index 27cce9c..8228fcb 100644
> --- a/tools/libxl/libxl_json.c
> +++ b/tools/libxl/libxl_json.c
> @@ -100,6 +100,42 @@ yajl_gen_status libxl_defbool_gen_json(yajl_gen hand,
>      return libxl__yajl_gen_asciiz(hand, libxl_defbool_to_string(*db));
>  }
>  
> +int libxl_defbool_parse_json(libxl__gc *gc, const libxl__json_object *o,
> +                             libxl_defbool *p)
> +{
> +    const char *s;
> +
> +    if (!libxl__json_object_is_string(o))
> +        return ERROR_FAIL;
> +
> +    s = libxl__json_object_get_string(o);
> +
> +    if (!strncmp(s, LIBXL__DEFBOOL_STR_DEFAULT,
> +                 strlen(LIBXL__DEFBOOL_STR_DEFAULT)))
> +        p->val = LIBXL__DEFBOOL_DEFAULT;
> +    else if (!strncmp(s, LIBXL__DEFBOOL_STR_TRUE,
> +                      strlen(LIBXL__DEFBOOL_STR_TRUE)))
> +        p->val = LIBXL__DEFBOOL_TRUE;
> +    else if (!strncmp(s, LIBXL__DEFBOOL_STR_FALSE,
> +                      strlen(LIBXL__DEFBOOL_STR_FALSE)))
> +        p->val = LIBXL__DEFBOOL_FALSE;
> +    else
> +        return ERROR_FAIL;
> +
> +    return 0;
> +}
> +
> +int libxl__bool_parse_json(libxl__gc *gc, const libxl__json_object *o,
> +                           bool *p)
> +{
> +    if (!libxl__json_object_is_bool(o))
> +        return ERROR_FAIL;
> +
> +    *p = libxl__json_object_get_bool(o);
> +
> +    return 0;
> +}
> +
>  yajl_gen_status libxl_uuid_gen_json(yajl_gen hand,
>                                      libxl_uuid *uuid)
>  {
> @@ -108,6 +144,15 @@ yajl_gen_status libxl_uuid_gen_json(yajl_gen hand,
>      return yajl_gen_string(hand, (const unsigned char *)buf, LIBXL_UUID_FMTLEN);
>  }
>  
> +int libxl_uuid_parse_json(libxl__gc *gc, const libxl__json_object *o,
> +                          libxl_uuid *p)
> +{
> +    if (!libxl__json_object_is_string(o))
> +        return ERROR_FAIL;
> +
> +    return libxl_uuid_from_string(p, o->u.string);
> +}
> +
>  yajl_gen_status libxl_bitmap_gen_json(yajl_gen hand,
>                                        libxl_bitmap *bitmap)
>  {
> @@ -128,6 +173,40 @@ out:
>      return s;
>  }
>  
> +int libxl_bitmap_parse_json(libxl__gc *gc, const libxl__json_object *o,
> +                            libxl_bitmap *p)
> +{
> +    int i;
> +    int size;
> +    const libxl__json_object *t;
> +    flexarray_t *array;
> +
> +    if (!libxl__json_object_is_array(o))
> +        return ERROR_FAIL;
> +
> +    array = libxl__json_object_get_array(o);
> +    if (!array->count) {
> +        libxl_bitmap_init(p);
> +        return 0;
> +    }
> +
> +    t = libxl__json_array_get(o, array->count - 1);
> +    if (!libxl__json_object_is_integer(t))
> +        return ERROR_FAIL;
> +    size = libxl__json_object_get_integer(t) + 1;
> +
> +    libxl_bitmap_alloc(CTX, p, size);
> +
> +    for (i = 0; (t = libxl__json_array_get(o, i)); i++) {
> +        if (!libxl__json_object_is_integer(t))
> +            return ERROR_FAIL;
> +
> +        libxl_bitmap_set(p, libxl__json_object_get_integer(t));
> +    }
> +
> +    return 0;
> +}
> +
>  yajl_gen_status libxl_key_value_list_gen_json(yajl_gen hand,
>                                                libxl_key_value_list *pkvl)
>  {
> @@ -155,6 +234,41 @@ out:
>      return s;
>  }
>  
> +int libxl_key_value_list_parse_json(libxl__gc *gc, const libxl__json_object *o,
> +                                    libxl_key_value_list *p)
> +{
> +    libxl__json_map_node *node = NULL;
> +    flexarray_t *maps = NULL;
> +    int i, size;
> +    libxl_key_value_list kvl;
> +
> +    if (!libxl__json_object_is_map(o))
> +        return ERROR_FAIL;
> +
> +    maps = libxl__json_object_get_map(o);
> +    size = maps->count * 2;
> +    kvl = *p = libxl__calloc(NOGC, size, sizeof(char *));
> +
> +    for (i = 0; i < maps->count; i++) {
> +        int idx = i * 2;
> +        if (flexarray_get(maps, i, (void**)&node) != 0)
> +            return ERROR_FAIL;
> +
> +        if (!libxl__json_object_is_string(node->obj) &&
> +            !libxl__json_object_is_null(node->obj))
> +            return ERROR_FAIL;
> +
> +        kvl[idx] = libxl__strdup(NOGC, node->map_key);
> +        if (libxl__json_object_is_string(node->obj))
> +            kvl[idx+1] =
> +                libxl__strdup(NOGC, libxl__json_object_get_string(node->obj));
> +        else
> +            kvl[idx+1] = NULL;
> +    }
> +
> +    return 0;
> +}
> +
>  yajl_gen_status libxl_string_list_gen_json(yajl_gen hand, libxl_string_list *pl)
>  {
>      libxl_string_list l = *pl;
> @@ -176,6 +290,38 @@ out:
>      return s;
>  }
>  
> +int libxl_string_list_parse_json(libxl__gc *gc, const libxl__json_object *o,
> +                                 libxl_string_list *p)
> +{
> +    const libxl__json_object *t;
> +    libxl_string_list l;
> +    flexarray_t *array = NULL;
> +    int i, size;
> +
> +    if (!libxl__json_object_is_array(o))
> +        return ERROR_FAIL;
> +
> +    array = libxl__json_object_get_array(o);
> +    size = array->count;
> +
> +    if (size == 0) {
> +        *p = NULL;
> +        return 0;
> +    }
> +
> +    /* need one extra slot as sentinel */
> +    l = *p = libxl__calloc(NOGC, size + 1, sizeof(char *));
> +
> +    for (i = 0; (t = libxl__json_array_get(o, i)); i++) {
> +        if (!libxl__json_object_is_string(t))
> +            return ERROR_FAIL;
> +
> +        l[i] = libxl__strdup(NOGC, libxl__json_object_get_string(t));
> +    }
> +
> +    return 0;
> +}
> +
>  yajl_gen_status libxl_mac_gen_json(yajl_gen hand, libxl_mac *mac)
>  {
>      char buf[LIBXL_MAC_FMTLEN+1];
> @@ -183,6 +329,15 @@ yajl_gen_status libxl_mac_gen_json(yajl_gen hand, libxl_mac *mac)
>      return yajl_gen_string(hand, (const unsigned char *)buf, LIBXL_MAC_FMTLEN);
>  }
>  
> +int libxl_mac_parse_json(libxl__gc *gc, const libxl__json_object *o,
> +                         libxl_mac *p)
> +{
> +    if (!libxl__json_object_is_string(o))
> +        return ERROR_FAIL;
> +
> +    return libxl__parse_mac(libxl__json_object_get_string(o), *p);
> +}
> +
>  yajl_gen_status libxl_hwcap_gen_json(yajl_gen hand,
>                                       libxl_hwcap *p)
>  {
> @@ -201,6 +356,27 @@ out:
>      return s;
>  }
>  
> +int libxl_hwcap_parse_json(libxl__gc *gc, const libxl__json_object *o,
> +                           libxl_hwcap *p)
> +{
> +    int i;
> +
> +    if (!libxl__json_object_is_array(o))
> +        return ERROR_FAIL;
> +
> +    for (i = 0; i<4; i++) {
> +        const libxl__json_object *t;
> +
> +        t = libxl__json_array_get(o, i);
> +        if (!t || !libxl__json_object_is_integer(t))
> +            return ERROR_FAIL;
> +
> +        (*p)[i] = libxl__json_object_get_integer(t);
> +    }
> +
> +    return 0;
> +}
> +
>  yajl_gen_status libxl__string_gen_json(yajl_gen hand,
>                                         const char *p)
>  {
> @@ -210,6 +386,20 @@ yajl_gen_status libxl__string_gen_json(yajl_gen hand,
>          return yajl_gen_null(hand);
>  }
>  
> +int libxl__string_parse_json(libxl__gc *gc, const libxl__json_object *o,
> +                             char **p)
> +{
> +    if (!libxl__json_object_is_string(o) && !libxl__json_object_is_null(o))
> +        return ERROR_FAIL;
> +
> +    if (libxl__json_object_is_null(o))
> +        *p = NULL;
> +    else
> +        *p = libxl__strdup(NOGC, libxl__json_object_get_string(o));
> +
> +    return 0;
> +}
> +
>  /*
>   * libxl__json_object helper functions
>   */
> @@ -824,6 +1014,55 @@ out:
>      return rc;
>  }
>  
> +int libxl__int_parse_json(libxl__gc *gc, const libxl__json_object *o,
> +                          void *p)
> +{
> +    long long i;
> +
> +    if (!libxl__json_object_is_integer(o))
> +        return ERROR_FAIL;
> +
> +    i = libxl__json_object_get_integer(o);
> +
> +    if (i > INT_MAX || i < INT_MIN)
> +        return ERROR_FAIL;
> +
> +    *((int *)p) = i;
> +
> +    return 0;
> +}
> +
> +/* Macro to generate:
> + *  libxl__uint8_parse_json
> + *  libxl__uint16_parse_json
> + *  libxl__uint32_parse_json
> + *  libxl__uint64_parse_json
> + */
> +#define PARSE_UINT(width)                                               \
> +    int libxl__uint ## width ## _parse_json(libxl__gc *gc,              \
> +                                            const libxl__json_object *o,\
> +                                            void *p)                    \
> +    {                                                                   \
> +        long long i;                                                    \
> +                                                                        \
> +        if (!libxl__json_object_is_integer(o))                          \
> +            return ERROR_FAIL;                                          \
> +                                                                        \
> +        i = libxl__json_object_get_integer(o);                          \
> +                                                                        \
> +        if (i > UINT ## width ## _MAX)                                  \
> +            return ERROR_FAIL;                                          \

My guest is this will always be false for uint64 and maybe for uint32.
The value return by get_interger can only be <= LLONG_MAX which I
suppose is still < UINT64_MAX.

Also, 'i' might be < 0.

If json contain a value > LLONG_MAX, the value will be store as a string
with the type number.

> +                                                                        \
> +        *((uint ## width ## _t *)p) = i;                                \
> +                                                                        \
> +        return 0;                                                       \
> +    }
> +
> +PARSE_UINT(8);
> +PARSE_UINT(16);
> +PARSE_UINT(32);
> +PARSE_UINT(64);
> +
>  /*
>   * Local variables:
>   * mode: C
> diff --git a/tools/libxl/libxl_json.h b/tools/libxl/libxl_json.h
> index a4dd8fc..924b2aa 100644
> --- a/tools/libxl/libxl_json.h
> +++ b/tools/libxl/libxl_json.h
> @@ -22,17 +22,51 @@
>  #  include <yajl/yajl_version.h>
>  #endif
>  
> +typedef struct libxl__gc libxl__gc;
> +typedef struct libxl__json_object libxl__json_object;
> +
>  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);
> +int libxl_defbool_parse_json(libxl__gc *gc, const libxl__json_object *o,
> +                             libxl_defbool *p);
> +int libxl__bool_parse_json(libxl__gc *gc, const libxl__json_object *o,
> +                           bool *p);
>  yajl_gen_status libxl_uuid_gen_json(yajl_gen hand, libxl_uuid *p);
> +int libxl_uuid_parse_json(libxl__gc *gc, const libxl__json_object *o,
> +                          libxl_uuid *p);
>  yajl_gen_status libxl_mac_gen_json(yajl_gen hand, libxl_mac *p);
> +int libxl_mac_parse_json(libxl__gc *gc, const libxl__json_object *o,
> +                         libxl_mac *p);
>  yajl_gen_status libxl_bitmap_gen_json(yajl_gen hand, libxl_bitmap *p);
> +int libxl_bitmap_parse_json(libxl__gc *gc, const libxl__json_object *o,
> +                            libxl_bitmap *p);
>  yajl_gen_status libxl_cpuid_policy_list_gen_json(yajl_gen hand,
>                                                   libxl_cpuid_policy_list *p);
> +int libxl_cpuid_policy_list_parse_json(libxl__gc *gc,
> +                                       const libxl__json_object *o,
> +                                       libxl_cpuid_policy_list *p);
>  yajl_gen_status libxl_string_list_gen_json(yajl_gen hand, libxl_string_list *p);
> +int libxl_string_list_parse_json(libxl__gc *gc, const libxl__json_object *o,
> +                                 libxl_string_list *p);
>  yajl_gen_status libxl_key_value_list_gen_json(yajl_gen hand,
>                                                libxl_key_value_list *p);
> +int libxl_key_value_list_parse_json(libxl__gc *gc,
> +                                    const libxl__json_object *o,
> +                                    libxl_key_value_list *p);
>  yajl_gen_status libxl_hwcap_gen_json(yajl_gen hand, libxl_hwcap *p);
> +int libxl_hwcap_parse_json(libxl__gc *gc, const libxl__json_object *o,
> +                           libxl_hwcap *p);
> +int libxl__int_parse_json(libxl__gc *gc, const libxl__json_object *o,
> +                          void *p);
> +int libxl__uint8_parse_json(libxl__gc *gc, const libxl__json_object *o,
> +                            void *p);
> +int libxl__uint16_parse_json(libxl__gc *gc, const libxl__json_object *o,
> +                             void *p);
> +int libxl__uint32_parse_json(libxl__gc *gc, const libxl__json_object *o,
> +                             void *p);
> +int libxl__uint64_parse_json(libxl__gc *gc, const libxl__json_object *o,
> +                             void *p);
> +int libxl__string_parse_json(libxl__gc *gc, const libxl__json_object *o,
> +                             char **p);
>  
>  #include <_libxl_types_json.h>
>  
> diff --git a/tools/libxl/libxl_nocpuid.c b/tools/libxl/libxl_nocpuid.c
> index 5f7cb6a..eb525fc 100644
> --- a/tools/libxl/libxl_nocpuid.c
> +++ b/tools/libxl/libxl_nocpuid.c
> @@ -44,6 +44,13 @@ yajl_gen_status libxl_cpuid_policy_list_gen_json(yajl_gen hand,
>      return 0;
>  }
>  
> +int libxl_cpuid_policy_list_parse_json(libxl__gc *gc,
> +                                       const libxl__json_object *o,
> +                                       libxl_cpuid_policy_list *p)
> +{
> +    return 0;
> +}
> +
>  /*
>   * Local variables:
>   * mode: C

This new patch looks fine, beyond the comment on PARSE_UINT().

-- 
Anthony PERARD

  reply	other threads:[~2014-05-06 14:35 UTC|newest]

Thread overview: 120+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-01 12:57 [PATCH V4 00/24] JSON infrastructure, new "xl-json" format and domain configuration synchronization Wei Liu
2014-05-01 12:57 ` [PATCH V4 01/24] xl / libxl: push parsing of SSID and CPU pool ID down to libxl Wei Liu
2014-05-06 12:45   ` Ian Campbell
2014-05-06 13:03     ` Wei Liu
2014-05-07  9:50       ` Ian Campbell
2014-05-07 10:30         ` Wei Liu
2014-05-01 12:57 ` [PATCH V4 02/24] libxl: fix memory leak in libxl_cpuid_dispose Wei Liu
2014-05-06 12:47   ` Ian Campbell
2014-05-01 12:58 ` [PATCH V4 03/24] libxl.h: document the paradigm of using libxl types Wei Liu
2014-05-06 12:49   ` Ian Campbell
2014-05-06 13:12     ` Ian Jackson
2014-05-06 13:49       ` Wei Liu
2014-05-07  9:53       ` Ian Campbell
2014-05-01 12:58 ` [PATCH V4 04/24] libxl.h: move / add some libxl defbool #define here Wei Liu
2014-05-06 12:50   ` Ian Campbell
2014-05-01 12:58 ` [PATCH V4 05/24] libxl IDL: rename json_fn to json_gen_fn Wei Liu
2014-05-01 12:58 ` [PATCH V4 06/24] libxl_json: introduce libx__object_from_json Wei Liu
2014-05-06 12:53   ` Ian Campbell
2014-05-01 12:58 ` [PATCH V4 07/24] libxl_internal: make JSON_* types a bit-field Wei Liu
2014-05-01 12:58 ` [PATCH V4 08/24] libxl_internal: introduce libxl__json_object_is_{null, number, double} Wei Liu
2014-05-01 12:58 ` [PATCH V4 09/24] libxl_json: introduce parser functions for builtin types Wei Liu
2014-05-06 12:57   ` Ian Campbell
2014-05-06 13:06     ` Wei Liu
2014-05-07  9:57       ` Ian Campbell
2014-05-06 13:57     ` Anthony PERARD
2014-05-06 14:04       ` Wei Liu
2014-05-06 14:35         ` Anthony PERARD [this message]
2014-05-06 14:45           ` Wei Liu
2014-05-06 14:49             ` Wei Liu
2014-05-06 15:14               ` Anthony PERARD
2014-05-06 15:42                 ` Wei Liu
2014-05-06 15:59                   ` Anthony PERARD
2014-05-06 16:13                     ` Wei Liu
2014-05-12 16:43                   ` Wei Liu
2014-05-13  8:26                     ` Ian Campbell
2014-05-13  9:19                       ` Wei Liu
2014-05-13  9:32                         ` Ian Campbell
2014-05-13 10:40                           ` Wei Liu
2014-05-13 10:45                             ` Ian Campbell
2014-05-13 10:51                               ` Wei Liu
2014-05-13 10:55                                 ` Ian Campbell
2014-05-13 11:03                                   ` Wei Liu
2014-05-13 11:13                                     ` Ian Campbell
2014-05-13 11:38                                       ` Wei Liu
2014-05-13 11:28                                     ` Anthony PERARD
2014-05-13 11:40                                       ` Wei Liu
2014-05-13 11:54                                         ` Ian Campbell
2014-05-13 11:58                                           ` Wei Liu
2014-05-01 12:58 ` [PATCH V4 10/24] libxl_json: allow basic JSON type objects generation Wei Liu
2014-05-06 13:02   ` Ian Campbell
2014-05-01 12:58 ` [PATCH V4 11/24] libxl/gentypes.py: include discriminator in JSON output Wei Liu
2014-05-06 13:03   ` Ian Campbell
2014-05-06 13:09     ` Wei Liu
2014-05-07 10:00       ` Ian Campbell
2014-05-07 10:35         ` Wei Liu
2014-05-07 10:45           ` Ian Campbell
2014-05-01 12:58 ` [PATCH V4 12/24] libxl IDL: generate code to parse libxl__json_object to libxl_FOO struct Wei Liu
2014-05-06 13:45   ` Ian Campbell
2014-05-01 12:58 ` [PATCH V4 13/24] libxl/gentest.py: test JSON parser Wei Liu
2014-05-06 13:46   ` Ian Campbell
2014-05-06 14:11     ` Wei Liu
2014-05-01 12:58 ` [PATCH V4 14/24] libxl: introduce libxl_key_value_list_length Wei Liu
2014-05-06 13:50   ` Ian Campbell
2014-05-06 14:13     ` Wei Liu
2014-05-01 12:58 ` [PATCH V4 15/24] libxl: introduce libxl_cpuid_policy_list_length Wei Liu
2014-05-06 13:51   ` Ian Campbell
2014-05-06 14:17     ` Wei Liu
2014-05-01 12:58 ` [PATCH V4 16/24] libxl: copy function for builtin types Wei Liu
2014-05-06 14:03   ` Ian Campbell
2014-05-06 14:36     ` Wei Liu
2014-05-07 10:05       ` Ian Campbell
2014-05-07 10:19         ` Wei Liu
2014-05-07 10:40           ` Ian Campbell
2014-05-07 10:47     ` Ian Jackson
2014-05-07 10:57       ` Ian Campbell
2014-05-07 12:55         ` Wei Liu
2014-05-07 13:10           ` Ian Campbell
2014-05-01 12:58 ` [PATCH V4 17/24] libxl IDL: generate deep copy functions Wei Liu
2014-05-06 14:06   ` Ian Campbell
2014-05-01 12:58 ` [PATCH V4 18/24] libxl/gentest.py: test " Wei Liu
2014-05-06 14:06   ` Ian Campbell
2014-05-01 12:58 ` [PATCH V4 19/24] xl: introduce and use "xl-json" format Wei Liu
2014-05-06 14:26   ` Ian Campbell
2014-05-06 15:17     ` Wei Liu
2014-05-06 16:35       ` Wei Liu
2014-05-07 10:11       ` Ian Campbell
2014-05-07 11:18         ` Ian Jackson
2014-05-07 11:20         ` Wei Liu
2014-05-07 11:30           ` Ian Campbell
2014-05-07 13:00             ` Wei Liu
2014-05-07 13:08               ` Ian Campbell
2014-05-07 11:16       ` Ian Jackson
2014-05-07 11:20         ` Ian Campbell
2014-05-07 12:56         ` Wei Liu
2014-05-01 12:58 ` [PATCH V4 20/24] xl: introduce load/save_domain_config Wei Liu
2014-05-06 14:28   ` Ian Campbell
2014-05-06 15:03     ` Wei Liu
2014-05-07 10:12       ` Ian Campbell
2014-05-01 12:58 ` [PATCH V4 21/24] xl: update domain configuration when running mem-set and mem-max Wei Liu
2014-05-06 14:30   ` Ian Campbell
2014-05-06 14:56     ` Wei Liu
2014-05-01 12:58 ` [PATCH V4 22/24] xl: update domain configuration when we hotplug a device Wei Liu
2014-05-06 15:44   ` Ian Campbell
2014-05-06 15:58     ` Wei Liu
2014-05-07 10:16       ` Ian Campbell
2014-05-06 16:57   ` David Vrabel
2014-05-06 17:13     ` Wei Liu
2014-05-07 10:21       ` David Vrabel
2014-05-07 10:42         ` Ian Campbell
2014-05-07 10:59       ` Andrew Cooper
2014-05-01 12:58 ` [PATCH V4 23/24] libxl: consider force removal of device successful Wei Liu
2014-05-06 15:48   ` Ian Campbell
2014-05-06 16:04     ` Wei Liu
2014-05-07 10:18       ` Ian Campbell
2014-05-07 13:09         ` Wei Liu
2014-05-01 12:58 ` [PATCH V4 24/24] xl: update configuration when we unplug a device Wei Liu
2014-05-06 15:55   ` Ian Campbell
2014-05-06 16:12     ` Wei Liu
2014-05-07 10:20       ` Ian Campbell
2014-05-01 13:02 ` [PATCH V4 00/24] JSON infrastructure, new "xl-json" format and domain configuration synchronization Wei Liu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140506143527.GH3530@perard.uk.xensource.com \
    --to=anthony.perard@citrix.com \
    --cc=Ian.Campbell@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=wei.liu2@citrix.com \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).