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.
This commit is contained in:
Peter Krempa 2015-05-21 18:25:36 +02:00
parent 2c67a3513e
commit 02a6c73f27
3 changed files with 28 additions and 7 deletions

View File

@ -1120,6 +1120,7 @@ virBitmapSetBit;
virBitmapSize; virBitmapSize;
virBitmapString; virBitmapString;
virBitmapToData; virBitmapToData;
virBitmapToDataBuf;
# util/virbuffer.h # util/virbuffer.h

View File

@ -492,25 +492,44 @@ virBitmapPtr virBitmapNewData(void *data, int len)
* *
* Convert a bitmap to a chunk of data containing bits information. * Convert a bitmap to a chunk of data containing bits information.
* Data consists of sequential bytes, with lower bytes containing * Data consists of sequential bytes, with lower bytes containing
* lower bits. * lower bits. This function allocates @data.
* *
* Returns 0 on success, -1 otherwise. * Returns 0 on success, -1 otherwise.
*/ */
int virBitmapToData(virBitmapPtr bitmap, unsigned char **data, int *dataLen) int virBitmapToData(virBitmapPtr bitmap, unsigned char **data, int *dataLen)
{ {
int len; int len;
unsigned long *l;
size_t i, j;
unsigned char *bytes;
len = (bitmap->max_bit + CHAR_BIT - 1) / CHAR_BIT; len = (bitmap->max_bit + CHAR_BIT - 1) / CHAR_BIT;
if (VIR_ALLOC_N(*data, len) < 0) if (VIR_ALLOC_N(*data, len) < 0)
return -1; return -1;
bytes = *data;
*dataLen = len; *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 */ /* htole64 is not provided by gnulib, so we do the conversion by hand */
l = bitmap->map; l = bitmap->map;
for (i = j = 0; i < len; i++, j++) { 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); bytes[i] = *l >> (j * CHAR_BIT);
} }
return 0;
} }
/** /**

View File

@ -88,6 +88,9 @@ virBitmapPtr virBitmapNewCopy(virBitmapPtr src) ATTRIBUTE_NONNULL(1);
virBitmapPtr virBitmapNewData(void *data, int len) ATTRIBUTE_NONNULL(1); virBitmapPtr virBitmapNewData(void *data, int len) ATTRIBUTE_NONNULL(1);
int virBitmapToData(virBitmapPtr bitmap, unsigned char **data, int *dataLen) 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); ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
bool virBitmapEqual(virBitmapPtr b1, virBitmapPtr b2); bool virBitmapEqual(virBitmapPtr b1, virBitmapPtr b2);