From 02a6c73f275ed1aa5986f14cfc376ef83084b1fe Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Thu, 21 May 2015 18:25:36 +0200 Subject: [PATCH] util: bitmap: Add virBitmapToDataBuf that does not allocate the buffer Since some functions can be optimized by reusing the buffers that they already have instead of allocating and copying new ones, lets split virBitmapToData to two functions where one only converts the data and the second one is a wrapper that allocates the buffer if necessary. --- src/libvirt_private.syms | 1 + src/util/virbitmap.c | 31 ++++++++++++++++++++++++------- src/util/virbitmap.h | 3 +++ 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index a90a1b7687..7b502aa31d 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1120,6 +1120,7 @@ virBitmapSetBit; virBitmapSize; virBitmapString; virBitmapToData; +virBitmapToDataBuf; # util/virbuffer.h diff --git a/src/util/virbitmap.c b/src/util/virbitmap.c index bf905aba4d..9abc8073dc 100644 --- a/src/util/virbitmap.c +++ b/src/util/virbitmap.c @@ -492,25 +492,44 @@ virBitmapPtr virBitmapNewData(void *data, int len) * * Convert a bitmap to a chunk of data containing bits information. * Data consists of sequential bytes, with lower bytes containing - * lower bits. + * lower bits. This function allocates @data. * * Returns 0 on success, -1 otherwise. */ int virBitmapToData(virBitmapPtr bitmap, unsigned char **data, int *dataLen) { int len; - unsigned long *l; - size_t i, j; - unsigned char *bytes; len = (bitmap->max_bit + CHAR_BIT - 1) / CHAR_BIT; if (VIR_ALLOC_N(*data, len) < 0) return -1; - bytes = *data; *dataLen = len; + virBitmapToDataBuf(bitmap, *data, *dataLen); + + return 0; +} + +/** + * virBitmapToDataBuf: + * @bytes: pointer to memory to fill + * @len: len of @bytes in byte + * + * Convert a bitmap to a chunk of data containing bits information. + * Data consists of sequential bytes, with lower bytes containing + * lower bits. + */ +void virBitmapToDataBuf(virBitmapPtr bitmap, + unsigned char *bytes, + size_t len) +{ + unsigned long *l; + size_t i, j; + + memset(bytes, 0, len); + /* htole64 is not provided by gnulib, so we do the conversion by hand */ l = bitmap->map; for (i = j = 0; i < len; i++, j++) { @@ -520,8 +539,6 @@ int virBitmapToData(virBitmapPtr bitmap, unsigned char **data, int *dataLen) } bytes[i] = *l >> (j * CHAR_BIT); } - - return 0; } /** diff --git a/src/util/virbitmap.h b/src/util/virbitmap.h index d326c6a6b0..47488de47c 100644 --- a/src/util/virbitmap.h +++ b/src/util/virbitmap.h @@ -88,6 +88,9 @@ virBitmapPtr virBitmapNewCopy(virBitmapPtr src) ATTRIBUTE_NONNULL(1); virBitmapPtr virBitmapNewData(void *data, int len) ATTRIBUTE_NONNULL(1); int virBitmapToData(virBitmapPtr bitmap, unsigned char **data, int *dataLen) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3); + +void virBitmapToDataBuf(virBitmapPtr bitmap, unsigned char *data, size_t len) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); bool virBitmapEqual(virBitmapPtr b1, virBitmapPtr b2); -- GitLab