From: Wei Liu <wei.liu2@citrix.com>
To: xen-devel@lists.xen.org
Cc: Wei Liu <wei.liu2@citrix.com>,
ian.jackson@eu.citrix.com, ian.campbell@citrix.com
Subject: [PATCH V5 24/32] libxl: copy function for builtin types
Date: Tue, 13 May 2014 22:54:06 +0100 [thread overview]
Message-ID: <1400018054-26038-25-git-send-email-wei.liu2@citrix.com> (raw)
In-Reply-To: <1400018054-26038-1-git-send-email-wei.liu2@citrix.com>
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@citrix.com>
---
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 +++
tools/libxl/libxl_uuid.h | 1 -
7 files changed, 147 insertions(+), 3 deletions(-)
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 0a73a98..c9475d7 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;
@@ -244,6 +267,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;
@@ -5684,6 +5735,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 4b75802..d5dfe2e 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -542,20 +542,29 @@
*/
#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;
@@ -574,6 +583,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)
@@ -618,8 +630,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 fe14b87..ee16663 100644
--- a/tools/libxl/libxl_cpuid.c
+++ b/tools/libxl/libxl_cpuid.c
@@ -467,6 +467,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
/*
diff --git a/tools/libxl/libxl_uuid.h b/tools/libxl/libxl_uuid.h
index 37c4d5f..041b927 100644
--- a/tools/libxl/libxl_uuid.h
+++ b/tools/libxl/libxl_uuid.h
@@ -61,7 +61,6 @@ void libxl_uuid_copy(libxl_ctx *ctx, libxl_uuid *dst, const libxl_uuid *src);
#if defined(LIBXL_API_VERSION) && LIBXL_API_VERSION < 0x040500
void libxl_uuid_copy(dst, src) libxl_uuid_copy(NULL, dst, src)
#endif
-
void libxl_uuid_clear(libxl_uuid *uuid);
int libxl_uuid_compare(libxl_uuid *uuid1, libxl_uuid *uuid2);
uint8_t *libxl_uuid_bytearray(libxl_uuid *uuid);
--
1.7.10.4
next prev parent reply other threads:[~2014-05-13 21:54 UTC|newest]
Thread overview: 127+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-13 21:53 [PATCH V5 00/32] JSON infrastructure, new "xl-json" format and domain configuration synchronization Wei Liu
2014-05-13 21:53 ` [PATCH V5 01/32] libxl: make cpupool_qualifier_to_cpupoolid a library function Wei Liu
2014-05-15 16:28 ` Ian Campbell
2014-05-20 14:47 ` Ian Jackson
2014-05-20 17:24 ` Wei Liu
2014-05-21 8:27 ` Ian Campbell
2014-05-21 8:37 ` Comments on LIBXL_HAVE_* defines (Was: Re: [PATCH V5 01/32] libxl: make cpupool_qualifier_to_cpupoolid a library function) Ian Campbell
2014-05-22 9:35 ` George Dunlap
2014-05-27 23:04 ` Wei Liu
2014-05-13 21:53 ` [PATCH V5 02/32] xl / libxl: push parsing of SSID and CPU pool ID down to libxl Wei Liu
2014-05-15 16:38 ` Ian Campbell
2014-05-15 17:11 ` Wei Liu
2014-05-13 21:53 ` [PATCH V5 03/32] xl / libxl: push VCPU affinity pinning " Wei Liu
2014-05-15 0:59 ` Dario Faggioli
2014-05-15 9:24 ` Wei Liu
2014-05-15 15:31 ` Dario Faggioli
2014-05-15 15:37 ` Wei Liu
2014-05-15 16:45 ` Ian Campbell
2014-05-15 17:06 ` Wei Liu
2014-05-15 17:19 ` Wei Liu
2014-05-16 9:51 ` Ian Campbell
2014-05-16 8:10 ` Dario Faggioli
2014-05-16 9:57 ` Ian Campbell
2014-05-16 10:15 ` Wei Liu
2014-05-16 10:28 ` Ian Campbell
2014-05-13 21:53 ` [PATCH V5 04/32] libxl: libxl_uuid_copy now taks a ctx argument Wei Liu
2014-05-15 16:51 ` Ian Campbell
2014-05-15 17:13 ` Wei Liu
2014-05-16 9:46 ` Ian Campbell
2014-05-16 10:18 ` Wei Liu
2014-05-16 10:30 ` Ian Campbell
2014-05-16 11:17 ` Wei Liu
2014-05-16 11:21 ` Wei Liu
2014-05-16 11:23 ` Ian Campbell
2014-05-16 11:28 ` Wei Liu
2014-05-16 11:31 ` Ian Campbell
2014-05-13 21:53 ` [PATCH V5 05/32] xl: remove parsing of "vncviewer" option in xl domain config file Wei Liu
2014-05-20 12:44 ` Ian Campbell
2014-05-13 21:53 ` [PATCH V5 06/32] libxl: fix memory leak in libxl_cpuid_dispose Wei Liu
2014-05-13 21:53 ` [PATCH V5 07/32] libxl.h: document the paradigm of using libxl types Wei Liu
2014-05-20 12:49 ` Ian Campbell
2014-05-20 14:54 ` Ian Jackson
2014-05-20 15:02 ` Ian Campbell
2014-05-13 21:53 ` [PATCH V5 08/32] libxl.h: document libxl_<type>_to_json Wei Liu
2014-05-20 12:50 ` Ian Campbell
2014-05-13 21:53 ` [PATCH V5 09/32] libxl_internal.h: move / add some libxl defbool #define here Wei Liu
2014-05-20 12:51 ` Ian Campbell
2014-05-13 21:53 ` [PATCH V5 10/32] libxl: fix JSON generator for uint64_t Wei Liu
2014-05-20 12:55 ` Ian Campbell
2014-05-20 13:15 ` Wei Liu
2014-05-13 21:53 ` [PATCH V5 11/32] libxl IDL: rename json_fn to json_gen_fn Wei Liu
2014-05-13 21:53 ` [PATCH V5 12/32] libxl_json: introduce libxl__object_from_json Wei Liu
2014-05-13 21:53 ` [PATCH V5 13/32] libxl_internal: make JSON_* types a bit-field Wei Liu
2014-05-13 21:53 ` [PATCH V5 14/32] libxl_internal.h: introduce libxl__json_object_is_{null, number, double} Wei Liu
2014-05-13 21:53 ` [PATCH V5 15/32] libxl_internal.h: introduce libxl__json_object_get_number Wei Liu
2014-05-20 12:56 ` Ian Campbell
2014-05-20 15:11 ` Ian Campbell
2014-05-13 21:53 ` [PATCH V5 16/32] libxl_json: introduce parser functions for builtin types Wei Liu
2014-05-13 21:53 ` [PATCH V5 17/32] libxl_json: allow basic JSON type objects generation Wei Liu
2014-05-13 21:54 ` [PATCH V5 18/32] libxl/gentypes.py: special-case KeyedUnion map handle generation Wei Liu
2014-05-20 13:26 ` Ian Campbell
2014-05-13 21:54 ` [PATCH V5 19/32] libxl/gentypes.py: don't generate default values Wei Liu
2014-05-20 13:29 ` Ian Campbell
2014-05-20 17:17 ` Wei Liu
2014-05-21 8:31 ` Ian Campbell
2014-05-13 21:54 ` [PATCH V5 20/32] libxl IDL: generate code to parse libxl__json_object to libxl_FOO struct Wei Liu
2014-05-20 13:35 ` Ian Campbell
2014-06-01 17:43 ` Wei Liu
2014-05-13 21:54 ` [PATCH V5 21/32] libxl/gentest.py: test JSON parser Wei Liu
2014-05-13 21:54 ` [PATCH V5 22/32] libxl: introduce libxl_key_value_list_length Wei Liu
2014-05-20 13:36 ` Ian Campbell
2014-05-13 21:54 ` [PATCH V5 23/32] libxl: introduce libxl_cpuid_policy_list_length Wei Liu
2014-05-20 13:36 ` Ian Campbell
2014-05-13 21:54 ` Wei Liu [this message]
2014-05-20 13:39 ` [PATCH V5 24/32] libxl: copy function for builtin types Ian Campbell
2014-05-13 21:54 ` [PATCH V5 25/32] libxl IDL: generate deep copy functions Wei Liu
2014-05-20 13:42 ` Ian Campbell
2014-05-13 21:54 ` [PATCH V5 26/32] libxl/gentest.py: test " Wei Liu
2014-05-13 21:54 ` [PATCH V5 27/32] libxl: libxl-json format and load/store configuration functions Wei Liu
2014-05-20 14:03 ` Ian Campbell
2014-06-01 18:41 ` Wei Liu
2014-06-02 16:19 ` Ian Campbell
2014-06-02 19:56 ` Wei Liu
2014-05-20 15:01 ` Ian Jackson
2014-06-01 18:46 ` Wei Liu
2014-05-13 21:54 ` [PATCH V5 28/32] libxl: store up-to-date domain configuration as we create domain Wei Liu
2014-05-20 14:12 ` Ian Campbell
2014-06-01 19:02 ` Wei Liu
2014-06-02 16:21 ` Ian Campbell
2014-05-20 15:04 ` Ian Jackson
2014-05-13 21:54 ` [PATCH V5 29/32] xl: use "libxl-json" format Wei Liu
2014-05-20 14:23 ` Ian Campbell
2014-05-20 15:13 ` Ian Jackson
2014-05-20 15:31 ` Ian Campbell
2014-06-01 19:37 ` Wei Liu
2014-06-02 16:30 ` Ian Campbell
2014-06-03 10:02 ` Wei Liu
2014-06-03 10:34 ` Ian Campbell
2014-05-20 15:11 ` Ian Jackson
2014-05-20 15:15 ` Ian Campbell
2014-05-20 15:39 ` Ian Jackson
2014-06-01 19:18 ` Wei Liu
2014-06-01 19:07 ` Wei Liu
2014-06-02 16:23 ` Ian Campbell
2014-05-13 21:54 ` [PATCH V5 30/32] libxl: consider force removal of device successful Wei Liu
2014-05-20 14:26 ` Ian Campbell
2014-06-01 19:44 ` Wei Liu
2014-05-20 15:15 ` Ian Jackson
2014-06-01 19:46 ` Wei Liu
2014-05-13 21:54 ` [PATCH V5 31/32] libxl: update domain configuration when updating memory targets Wei Liu
2014-05-20 14:32 ` Ian Campbell
2014-06-01 20:00 ` Wei Liu
2014-05-20 15:21 ` Ian Jackson
2014-05-20 15:35 ` Ian Campbell
2014-05-20 15:44 ` Ian Jackson
2014-05-20 15:55 ` Ian Campbell
2014-05-20 16:03 ` Ian Jackson
2014-05-21 8:38 ` Ian Campbell
2014-06-01 20:51 ` Wei Liu
2014-06-01 20:22 ` Wei Liu
2014-06-02 16:32 ` Ian Campbell
2014-05-13 21:54 ` [PATCH V5 32/32] libxl: synchronize configuration when we plug / unplug device Wei Liu
2014-05-20 14:35 ` Ian Campbell
2014-05-20 15:33 ` Ian Jackson
2014-06-01 20:57 ` Wei Liu
2014-06-02 16:33 ` Ian Campbell
2014-05-21 10:18 ` [PATCH V5 00/32] JSON infrastructure, new "xl-json" format and domain configuration synchronization Ian Campbell
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=1400018054-26038-25-git-send-email-wei.liu2@citrix.com \
--to=wei.liu2@citrix.com \
--cc=ian.campbell@citrix.com \
--cc=ian.jackson@eu.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).