[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v6 16/18] libxl: copy function for builtin types
These functions will be used in later patch to deep-copy a structure. Functions introduced: * libxl_string_list_copy * libxl_key_value_list_copy * libxl_hwcap_copy * libxl_mac_copy * libxl_cpuid_policy_list_copy * libxl_string_copy * libxl_bitmap_copy_alloc Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- tools/libxl/libxl.c | 67 +++++++++++++++++++++++++++++++++++++++++++ tools/libxl/libxl.h | 14 +++++++-- tools/libxl/libxl_cpuid.c | 33 +++++++++++++++++++++ tools/libxl/libxl_nocpuid.c | 6 ++++ tools/libxl/libxl_utils.c | 25 ++++++++++++++++ tools/libxl/libxl_utils.h | 4 +++ 6 files changed, 147 insertions(+), 2 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index a5ed1e2..2a4d710 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -205,6 +205,29 @@ void libxl_string_list_dispose(libxl_string_list *psl) free(sl); } +void libxl_string_list_copy(libxl_ctx *ctx, + libxl_string_list *dst, + libxl_string_list *src) +{ + GC_INIT(ctx); + int i, len; + + if (!*src) { + *dst = NULL; + goto out; + } + + len = libxl_string_list_length(src); + /* one extra slot for sentinel */ + *dst = libxl__calloc(NOGC, len + 1, sizeof(char *)); + + for (i = 0; i < len; i++) + (*dst)[i] = libxl__strdup(NOGC, (*src)[i]); + +out: + GC_FREE; +} + int libxl_string_list_length(const libxl_string_list *psl) { int i = 0; @@ -245,6 +268,34 @@ void libxl_key_value_list_dispose(libxl_key_value_list *pkvl) free(kvl); } +void libxl_key_value_list_copy(libxl_ctx *ctx, + libxl_key_value_list *dst, + libxl_key_value_list *src) +{ + GC_INIT(ctx); + int i, len; + + if (*src == NULL) { + *dst = NULL; + goto out; + } + + len = libxl_key_value_list_length(src); + /* one extra slot for sentinel */ + *dst = libxl__calloc(NOGC, len * 2 + 1, sizeof(char *)); + + for (i = 0; i < len * 2; i += 2) { + (*dst)[i] = libxl__strdup(NOGC, (*src)[i]); + if ((*src)[i+1]) + (*dst)[i+1] = libxl__strdup(NOGC, (*src)[i+1]); + else + (*dst)[i+1] = NULL; + } + +out: + GC_FREE; +} + void libxl_defbool_set(libxl_defbool *db, bool b) { db->val = b ? LIBXL__DEFBOOL_TRUE : LIBXL__DEFBOOL_FALSE; @@ -5688,6 +5739,22 @@ int libxl_fd_set_cloexec(libxl_ctx *ctx, int fd, int cloexec) int libxl_fd_set_nonblock(libxl_ctx *ctx, int fd, int nonblock) { return fd_set_flags(ctx,fd, F_GETFL,F_SETFL,"FL", O_NONBLOCK, nonblock); } + +void libxl_hwcap_copy(libxl_ctx *ctx,libxl_hwcap *dst, libxl_hwcap *src) +{ + int i; + + for (i = 0; i < 8; i++) + (*dst)[i] = (*src)[i]; +} + +void libxl_mac_copy(libxl_ctx *ctx, libxl_mac *dst, libxl_mac *src) +{ + int i; + + for (i = 0; i < 6; i++) + (*dst)[i] = (*src)[i]; +} /* * Local variables: * mode: C diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 5f2642b..41d1b18 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -556,20 +556,29 @@ typedef struct libxl__ctx libxl_ctx; */ #define LIBXL_HAVE_CPUPOOL_NAME 1 +typedef struct libxl__ctx libxl_ctx; + typedef uint8_t libxl_mac[6]; #define LIBXL_MAC_FMT "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx" #define LIBXL_MAC_FMTLEN ((2*6)+5) /* 6 hex bytes plus 5 colons */ #define LIBXL_MAC_BYTES(mac) mac[0], mac[1], mac[2], mac[3], mac[4], mac[5] +void libxl_mac_copy(libxl_ctx *ctx, libxl_mac *dst, libxl_mac *src); typedef char **libxl_string_list; void libxl_string_list_dispose(libxl_string_list *sl); int libxl_string_list_length(const libxl_string_list *sl); +void libxl_string_list_copy(libxl_ctx *ctx, libxl_string_list *dst, + libxl_string_list *src); typedef char **libxl_key_value_list; void libxl_key_value_list_dispose(libxl_key_value_list *kvl); int libxl_key_value_list_length(libxl_key_value_list *kvl); +void libxl_key_value_list_copy(libxl_ctx *ctx, + libxl_key_value_list *dst, + libxl_key_value_list *src); typedef uint32_t libxl_hwcap[8]; +void libxl_hwcap_copy(libxl_ctx *ctx, libxl_hwcap *dst, libxl_hwcap *src); typedef uint64_t libxl_ev_user; @@ -588,6 +597,9 @@ typedef struct libxl__cpuid_policy libxl_cpuid_policy; typedef libxl_cpuid_policy * libxl_cpuid_policy_list; void libxl_cpuid_dispose(libxl_cpuid_policy_list *cpuid_list); int libxl_cpuid_policy_list_length(libxl_cpuid_policy_list *l); +void libxl_cpuid_policy_list_copy(libxl_ctx *ctx, + libxl_cpuid_policy_list *dst, + libxl_cpuid_policy_list *src); #define LIBXL_PCI_FUNC_ALL (~0U) @@ -632,8 +644,6 @@ bool libxl_defbool_val(libxl_defbool db); const char *libxl_defbool_to_string(libxl_defbool b); -typedef struct libxl__ctx libxl_ctx; - #define LIBXL_TIMER_MODE_DEFAULT -1 #define LIBXL_MEMKB_DEFAULT ~0ULL diff --git a/tools/libxl/libxl_cpuid.c b/tools/libxl/libxl_cpuid.c index 1f2bcd5..f3e67ab 100644 --- a/tools/libxl/libxl_cpuid.c +++ b/tools/libxl/libxl_cpuid.c @@ -468,6 +468,39 @@ int libxl_cpuid_policy_list_length(libxl_cpuid_policy_list *pl) return i; } +void libxl_cpuid_policy_list_copy(libxl_ctx *ctx, + libxl_cpuid_policy_list *dst, + libxl_cpuid_policy_list *src) +{ + GC_INIT(ctx); + int i, j, len; + + if (*src == NULL) { + *dst = NULL; + goto out; + } + + len = libxl_cpuid_policy_list_length(src); + /* one extra slot for sentinel */ + *dst = libxl__calloc(NOGC, len + 1, sizeof(libxl_cpuid_policy)); + (*dst)[len].input[0] = XEN_CPUID_INPUT_UNUSED; + (*dst)[len].input[1] = XEN_CPUID_INPUT_UNUSED; + + for (i = 0; i < len; i++) { + for (j = 0; j < 2; j++) + (*dst)[i].input[j] = (*src)[i].input[j]; + for (j = 0; j < 4; j++) + if ((*src)[i].policy[j]) + (*dst)[i].policy[j] = + libxl__strdup(NOGC, (*src)[i].policy[j]); + else + (*dst)[i].policy[j] = NULL; + } + +out: + GC_FREE; +} + /* * Local variables: * mode: C diff --git a/tools/libxl/libxl_nocpuid.c b/tools/libxl/libxl_nocpuid.c index eb525fc..698d252 100644 --- a/tools/libxl/libxl_nocpuid.c +++ b/tools/libxl/libxl_nocpuid.c @@ -51,6 +51,12 @@ int libxl_cpuid_policy_list_parse_json(libxl__gc *gc, return 0; } +void libxl_cpuid_policy_list_copy(libxl_ctx *ctx, + libxl_cpuid_policy_list *dst, + libxl_cpuid_policy_list *src) +{ +} + /* * Local variables: * mode: C diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index 16b734e..6053017 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -614,6 +614,19 @@ void libxl_bitmap_copy(libxl_ctx *ctx, libxl_bitmap *dptr, memcpy(dptr->map, sptr->map, sz * sizeof(*dptr->map)); } +void libxl_bitmap_copy_alloc(libxl_ctx *ctx, + libxl_bitmap *dptr, + const libxl_bitmap *sptr) +{ + GC_INIT(ctx); + + dptr->map = libxl__calloc(NOGC, sptr->size, sizeof(*sptr->map)); + dptr->size = sptr->size; + memcpy(dptr->map, sptr->map, sptr->size * sizeof(*sptr->map)); + + GC_FREE; +} + int libxl_bitmap_is_full(const libxl_bitmap *bitmap) { int i; @@ -1013,6 +1026,18 @@ int libxl_domid_valid_guest(uint32_t domid) return domid > 0 && domid < DOMID_FIRST_RESERVED; } +void libxl_string_copy(libxl_ctx *ctx, char **dst, char **src) +{ + GC_INIT(ctx); + + if (*src) + *dst = libxl__strdup(NOGC, *src); + else + *dst = NULL; + + GC_FREE; +} + /* * Local variables: * mode: C diff --git a/tools/libxl/libxl_utils.h b/tools/libxl/libxl_utils.h index 8bfb81b..cc528d2 100644 --- a/tools/libxl/libxl_utils.h +++ b/tools/libxl/libxl_utils.h @@ -76,6 +76,8 @@ int libxl_devid_to_device_vtpm(libxl_ctx *ctx, uint32_t domid, int libxl_bitmap_alloc(libxl_ctx *ctx, libxl_bitmap *bitmap, int n_bits); /* Allocated bimap is from malloc, libxl_bitmap_dispose() to be * called by the application when done. */ +void libxl_bitmap_copy_alloc(libxl_ctx *ctx, libxl_bitmap *dptr, + const libxl_bitmap *sptr); void libxl_bitmap_copy(libxl_ctx *ctx, libxl_bitmap *dptr, const libxl_bitmap *sptr); int libxl_bitmap_is_full(const libxl_bitmap *bitmap); @@ -121,6 +123,8 @@ int libxl_cpumap_to_nodemap(libxl_ctx *ctx, return (s + 1023) / 1024; } +void libxl_string_copy(libxl_ctx *ctx, char **dst, char **src); + #endif /* -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |