From: "Daniel P. Berrange" <berrange@xxxxxxxxxx> Signed-off-by: Daniel P. Berrange <berrange@xxxxxxxxxx> --- src/Makefile.am | 2 +- src/conf/cpu_conf.h | 2 +- src/conf/domain_conf.c | 3 +- src/conf/domain_conf.h | 2 +- src/conf/network_conf.h | 2 +- src/conf/snapshot_conf.c | 2 +- src/libxl/libxl_conf.h | 2 +- src/qemu/qemu_capabilities.c | 2 +- src/qemu/qemu_conf.h | 2 +- src/qemu/qemu_driver.c | 2 +- src/qemu/qemu_monitor.h | 2 +- src/qemu/qemu_monitor_json.h | 2 +- src/qemu/qemu_process.c | 2 +- src/util/bitmap.c | 636 ------------------------------------------- src/util/bitmap.h | 109 -------- src/util/dnsmasq.c | 2 +- src/util/processinfo.h | 2 +- src/util/virbitmap.c | 636 +++++++++++++++++++++++++++++++++++++++++++ src/util/virbitmap.h | 109 ++++++++ tests/virbitmaptest.c | 2 +- tools/virsh-domain.c | 2 +- tools/virsh.c | 2 +- 22 files changed, 763 insertions(+), 764 deletions(-) delete mode 100644 src/util/bitmap.c delete mode 100644 src/util/bitmap.h create mode 100644 src/util/virbitmap.c create mode 100644 src/util/virbitmap.h diff --git a/src/Makefile.am b/src/Makefile.am index 149ffc9..25a21e8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -53,7 +53,6 @@ augeastest_DATA = # These files are not related to driver APIs. Simply generic # helper APIs for various purposes UTIL_SOURCES = \ - util/bitmap.c util/bitmap.h \ util/buf.c util/buf.h \ util/command.c util/command.h \ util/conf.c util/conf.h \ @@ -83,6 +82,7 @@ UTIL_SOURCES = \ util/viraudit.c util/viraudit.h \ util/virauth.c util/virauth.h \ util/virauthconfig.c util/virauthconfig.h \ + util/virbitmap.c util/virbitmap.h \ util/virfile.c util/virfile.h \ util/virnodesuspend.c util/virnodesuspend.h \ util/virobject.c util/virobject.h \ diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h index 879f8eb..38fc675 100644 --- a/src/conf/cpu_conf.h +++ b/src/conf/cpu_conf.h @@ -27,7 +27,7 @@ # include "util.h" # include "buf.h" # include "xml.h" -# include "bitmap.h" +# include "virbitmap.h" # define VIR_CPU_VENDOR_ID_LENGTH 12 diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 19af058..c90c6b9 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -44,14 +44,13 @@ #include "nwfilter_conf.h" #include "storage_file.h" #include "virfile.h" -#include "bitmap.h" +#include "virbitmap.h" #include "count-one-bits.h" #include "secret_conf.h" #include "netdev_vport_profile_conf.h" #include "netdev_bandwidth_conf.h" #include "netdev_vlan_conf.h" #include "device_conf.h" -#include "bitmap.h" #define VIR_FROM_THIS VIR_FROM_DOMAIN diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index bc9ef88..26d2264 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -46,7 +46,7 @@ # include "virnetdevvlan.h" # include "virobject.h" # include "device_conf.h" -# include "bitmap.h" +# include "virbitmap.h" # include "storage_file.h" /* forward declarations of all device types, required by diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h index 72cf64b..4d70fe6 100644 --- a/src/conf/network_conf.h +++ b/src/conf/network_conf.h @@ -38,7 +38,7 @@ # include "virnetdevvlan.h" # include "virmacaddr.h" # include "device_conf.h" -# include "bitmap.h" +# include "virbitmap.h" enum virNetworkForwardType { VIR_NETWORK_FORWARD_NONE = 0, diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c index bba1bb7..95b7943 100644 --- a/src/conf/snapshot_conf.c +++ b/src/conf/snapshot_conf.c @@ -29,7 +29,7 @@ #include <unistd.h> #include "internal.h" -#include "bitmap.h" +#include "virbitmap.h" #include "buf.h" #include "count-one-bits.h" #include "datatypes.h" diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h index 6bcf805..c8808a1 100644 --- a/src/libxl/libxl_conf.h +++ b/src/libxl/libxl_conf.h @@ -34,7 +34,7 @@ # include "domain_event.h" # include "capabilities.h" # include "configmake.h" -# include "bitmap.h" +# include "virbitmap.h" # define LIBXL_VNC_PORT_MIN 5900 diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 104a3f8..45962b0 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -35,7 +35,7 @@ #include "cpu/cpu.h" #include "domain_conf.h" #include "command.h" -#include "bitmap.h" +#include "virbitmap.h" #include "virnodesuspend.h" #include "qemu_monitor.h" diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index cfa6fff..bcf21c3 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -39,7 +39,7 @@ # include "hostusb.h" # include "cpu_conf.h" # include "driver.h" -# include "bitmap.h" +# include "virbitmap.h" # include "command.h" # include "threadpool.h" # include "locking/lock_manager.h" diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 2dd6922..e87397f 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -92,7 +92,7 @@ #include "virnodesuspend.h" #include "virtime.h" #include "virtypedparam.h" -#include "bitmap.h" +#include "virbitmap.h" #define VIR_FROM_THIS VIR_FROM_QEMU diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index dbfab88..8c42b12 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -28,7 +28,7 @@ # include "internal.h" # include "domain_conf.h" -# include "bitmap.h" +# include "virbitmap.h" # include "virhash.h" # include "json.h" # include "device_conf.h" diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index acca4ec..2b09a8f 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -28,7 +28,7 @@ # include "internal.h" # include "qemu_monitor.h" -# include "bitmap.h" +# include "virbitmap.h" int qemuMonitorJSONIOProcess(qemuMonitorPtr mon, const char *data, diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index cc0e947..969cbc7 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -69,7 +69,7 @@ #include "virprocess.h" #include "virtime.h" #include "virnetdevtap.h" -#include "bitmap.h" +#include "virbitmap.h" #define VIR_FROM_THIS VIR_FROM_QEMU diff --git a/src/util/bitmap.c b/src/util/bitmap.c deleted file mode 100644 index c29f5f3..0000000 --- a/src/util/bitmap.c +++ /dev/null @@ -1,636 +0,0 @@ -/* - * bitmap.h: Simple bitmap operations - * - * Copyright (C) 2010-2012 Red Hat, Inc. - * Copyright (C) 2010 Novell, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see - * <http://www.gnu.org/licenses/>. - * - * Author: Jim Fehlig <jfehlig@xxxxxxxxxx> - */ - -#include <config.h> - -#include <limits.h> -#include <stdint.h> -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <sys/types.h> - -#include "bitmap.h" -#include "memory.h" -#include "buf.h" -#include "util.h" -#include "c-ctype.h" -#include "count-one-bits.h" - - -struct _virBitmap { - size_t max_bit; - size_t map_len; - unsigned long *map; -}; - - -#define VIR_BITMAP_BITS_PER_UNIT ((int) sizeof(unsigned long) * CHAR_BIT) -#define VIR_BITMAP_UNIT_OFFSET(b) ((b) / VIR_BITMAP_BITS_PER_UNIT) -#define VIR_BITMAP_BIT_OFFSET(b) ((b) % VIR_BITMAP_BITS_PER_UNIT) -#define VIR_BITMAP_BIT(b) (1UL << VIR_BITMAP_BIT_OFFSET(b)) - - -/** - * virBitmapNew: - * @size: number of bits - * - * Allocate a bitmap capable of containing @size bits. - * - * Returns a pointer to the allocated bitmap or NULL if - * memory cannot be allocated. - */ -virBitmapPtr virBitmapNew(size_t size) -{ - virBitmapPtr bitmap; - size_t sz; - - if (SIZE_MAX - VIR_BITMAP_BITS_PER_UNIT < size || size == 0) - return NULL; - - sz = (size + VIR_BITMAP_BITS_PER_UNIT - 1) / - VIR_BITMAP_BITS_PER_UNIT; - - if (VIR_ALLOC(bitmap) < 0) - return NULL; - - if (VIR_ALLOC_N(bitmap->map, sz) < 0) { - VIR_FREE(bitmap); - return NULL; - } - - bitmap->max_bit = size; - bitmap->map_len = sz; - return bitmap; -} - -/** - * virBitmapFree: - * @bitmap: previously allocated bitmap - * - * Free @bitmap previously allocated by virBitmapNew. - */ -void virBitmapFree(virBitmapPtr bitmap) -{ - if (bitmap) { - VIR_FREE(bitmap->map); - VIR_FREE(bitmap); - } -} - - -int virBitmapCopy(virBitmapPtr dst, virBitmapPtr src) -{ - if (dst->max_bit != src->max_bit) { - errno = EINVAL; - return -1; - } - - memcpy(dst->map, src->map, src->map_len * sizeof(src->map[0])); - - return 0; -} - - -/** - * virBitmapSetBit: - * @bitmap: Pointer to bitmap - * @b: bit position to set - * - * Set bit position @b in @bitmap - * - * Returns 0 on if bit is successfully set, -1 on error. - */ -int virBitmapSetBit(virBitmapPtr bitmap, size_t b) -{ - if (bitmap->max_bit <= b) - return -1; - - bitmap->map[VIR_BITMAP_UNIT_OFFSET(b)] |= VIR_BITMAP_BIT(b); - return 0; -} - -/** - * virBitmapClearBit: - * @bitmap: Pointer to bitmap - * @b: bit position to clear - * - * Clear bit position @b in @bitmap - * - * Returns 0 on if bit is successfully clear, -1 on error. - */ -int virBitmapClearBit(virBitmapPtr bitmap, size_t b) -{ - if (bitmap->max_bit <= b) - return -1; - - bitmap->map[VIR_BITMAP_UNIT_OFFSET(b)] &= ~VIR_BITMAP_BIT(b); - return 0; -} - -/* Helper function. caller must ensure b < bitmap->max_bit */ -static bool virBitmapIsSet(virBitmapPtr bitmap, size_t b) -{ - return !!(bitmap->map[VIR_BITMAP_UNIT_OFFSET(b)] & VIR_BITMAP_BIT(b)); -} - -/** - * virBitmapGetBit: - * @bitmap: Pointer to bitmap - * @b: bit position to get - * @result: bool pointer to receive bit setting - * - * Get setting of bit position @b in @bitmap and store in @result - * - * On success, @result will contain the setting of @b and 0 is - * returned. On failure, -1 is returned and @result is unchanged. - */ -int virBitmapGetBit(virBitmapPtr bitmap, size_t b, bool *result) -{ - if (bitmap->max_bit <= b) - return -1; - - *result = virBitmapIsSet(bitmap, b); - return 0; -} - -/** - * virBitmapString: - * @bitmap: Pointer to bitmap - * - * Convert @bitmap to printable string. - * - * Returns pointer to the string or NULL on error. - */ -char *virBitmapString(virBitmapPtr bitmap) -{ - virBuffer buf = VIR_BUFFER_INITIALIZER; - size_t sz; - - virBufferAddLit(&buf, "0x"); - - sz = bitmap->map_len; - - while (sz--) { - virBufferAsprintf(&buf, "%0*lx", - VIR_BITMAP_BITS_PER_UNIT / 4, - bitmap->map[sz]); - } - - if (virBufferError(&buf)) { - virBufferFreeAndReset(&buf); - return NULL; - } - - return virBufferContentAndReset(&buf); -} - -/** - * virBitmapFormat: - * @bitmap: the bitmap - * - * This function is the counterpart of virBitmapParse. This function creates - * a human-readable string representing the bits in bitmap. - * - * See virBitmapParse for the format of @str. - * - * Returns the string on success or NULL otherwise. Caller should call - * VIR_FREE to free the string. - */ -char *virBitmapFormat(virBitmapPtr bitmap) -{ - virBuffer buf = VIR_BUFFER_INITIALIZER; - bool first = true; - int start, cur, prev; - - if (!bitmap) - return NULL; - - cur = virBitmapNextSetBit(bitmap, -1); - if (cur < 0) - return strdup(""); - - start = prev = cur; - while (prev >= 0) { - cur = virBitmapNextSetBit(bitmap, prev); - - if (cur == prev + 1) { - prev = cur; - continue; - } - - /* cur < 0 or cur > prev + 1 */ - - if (!first) - virBufferAddLit(&buf, ","); - else - first = false; - - if (prev == start) - virBufferAsprintf(&buf, "%d", start); - else - virBufferAsprintf(&buf, "%d-%d", start, prev); - - start = prev = cur; - } - - if (virBufferError(&buf)) { - virBufferFreeAndReset(&buf); - return NULL; - } - - return virBufferContentAndReset(&buf); -} - -/** - * virBitmapParse: - * @str: points to a string representing a human-readable bitmap - * @bitmap: a bitmap created from @str - * @bitmapSize: the upper limit of num of bits in created bitmap - * - * This function is the counterpart of virBitmapFormat. This function creates - * a bitmap, in which bits are set according to the content of @str. - * - * @str is a comma separated string of fields N, which means a number of bit - * to set, and ^N, which means to unset the bit, and N-M for ranges of bits - * to set. - * - * Returns the number of bits set in @bitmap, or -1 in case of error. - */ - -int virBitmapParse(const char *str, - char sep, - virBitmapPtr *bitmap, - size_t bitmapSize) -{ - int ret = 0; - bool neg = false; - const char *cur; - char *tmp; - int i, start, last; - - if (!str) - return -1; - - cur = str; - virSkipSpaces(&cur); - - if (*cur == 0) - return -1; - - *bitmap = virBitmapNew(bitmapSize); - if (!*bitmap) - return -1; - - while (*cur != 0 && *cur != sep) { - /* - * 3 constructs are allowed: - * - N : a single CPU number - * - N-M : a range of CPU numbers with N < M - * - ^N : remove a single CPU number from the current set - */ - if (*cur == '^') { - cur++; - neg = true; - } - - if (!c_isdigit(*cur)) - goto parse_error; - - if (virStrToLong_i(cur, &tmp, 10, &start) < 0) - goto parse_error; - if (start < 0) - goto parse_error; - - cur = tmp; - - virSkipSpaces(&cur); - - if (*cur == ',' || *cur == 0 || *cur == sep) { - if (neg) { - if (virBitmapIsSet(*bitmap, start)) { - ignore_value(virBitmapClearBit(*bitmap, start)); - ret--; - } - } else { - if (!virBitmapIsSet(*bitmap, start)) { - ignore_value(virBitmapSetBit(*bitmap, start)); - ret++; - } - } - } else if (*cur == '-') { - if (neg) - goto parse_error; - - cur++; - virSkipSpaces(&cur); - - if (virStrToLong_i(cur, &tmp, 10, &last) < 0) - goto parse_error; - if (last < start) - goto parse_error; - - cur = tmp; - - for (i = start; i <= last; i++) { - if (!virBitmapIsSet(*bitmap, i)) { - ignore_value(virBitmapSetBit(*bitmap, i)); - ret++; - } - } - - virSkipSpaces(&cur); - } - - if (*cur == ',') { - cur++; - virSkipSpaces(&cur); - neg = false; - } else if (*cur == 0 || *cur == sep) { - break; - } else { - goto parse_error; - } - } - - return ret; - -parse_error: - virBitmapFree(*bitmap); - *bitmap = NULL; - return -1; -} - -/** - * virBitmapNewCopy: - * @src: the source bitmap. - * - * Makes a copy of bitmap @src. - * - * returns the copied bitmap on success, or NULL otherwise. Caller - * should call virBitmapFree to free the returned bitmap. - */ -virBitmapPtr virBitmapNewCopy(virBitmapPtr src) -{ - virBitmapPtr dst; - - if ((dst = virBitmapNew(src->max_bit)) == NULL) - return NULL; - - if (virBitmapCopy(dst, src) != 0) { - virBitmapFree(dst); - return NULL; - } - - return dst; -} - -/** - * virBitmapNewData: - * @data: the data - * @len: length of @data in bytes - * - * Allocate a bitmap from a chunk of data containing bits - * information - * - * Returns a pointer to the allocated bitmap or NULL if - * memory cannot be allocated. - */ -virBitmapPtr virBitmapNewData(void *data, int len) -{ - virBitmapPtr bitmap; - int i, j; - unsigned long *p; - unsigned char *bytes = data; - - bitmap = virBitmapNew(len * CHAR_BIT); - if (!bitmap) - return NULL; - - /* le64toh is not provided by gnulib, so we do the conversion by hand */ - p = bitmap->map; - for (i = j = 0; i < len; i++, j++) { - if (j == sizeof(*p)) { - j = 0; - p++; - } - *p |= (unsigned long) bytes[i] << (j * CHAR_BIT); - } - - return bitmap; -} - -/** - * virBitmapToData: - * @data: the data - * @len: len of @data in byte - * - * Convert a bitmap to a chunk of data containing bits information. - * Data consists of sequential bytes, with lower bytes containing - * lower bits. - * - * Returns 0 on success, -1 otherwise. - */ -int virBitmapToData(virBitmapPtr bitmap, unsigned char **data, int *dataLen) -{ - int len; - unsigned long *l; - int 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; - - /* htole64 is not provided by gnulib, so we do the conversion by hand */ - l = bitmap->map; - for (i = j = 0; i < len; i++, j++) { - if (j == sizeof(*l)) { - j = 0; - l++; - } - bytes[i] = *l >> (j * CHAR_BIT); - } - - return 0; -} - -/** - * virBitmapEqual: - * @b1: bitmap 1 - * @b2: bitmap 2 - * - * Compares two bitmaps, whose lengths can be different from each other. - * - * Returns true if two bitmaps have exactly the same set of bits set, - * otherwise false. - */ -bool virBitmapEqual(virBitmapPtr b1, virBitmapPtr b2) -{ - virBitmapPtr tmp; - int i; - - if (b1->max_bit > b2->max_bit) { - tmp = b1; - b1 = b2; - b2 = tmp; - } - - /* Now b1 is the smaller one, if not equal */ - - for (i = 0; i < b1->map_len; i++) { - if (b1->map[i] != b2->map[i]) - return false; - } - - for (; i < b2->map_len; i++) { - if (b2->map[i]) - return false; - } - - return true; -} - -size_t virBitmapSize(virBitmapPtr bitmap) -{ - return bitmap->max_bit; -} - -/** - * virBitmapSetAll: - * @bitmap: the bitmap - * - * set all bits in @bitmap. - */ -void virBitmapSetAll(virBitmapPtr bitmap) -{ - int tail = bitmap->max_bit % VIR_BITMAP_BITS_PER_UNIT; - - memset(bitmap->map, 0xff, - bitmap->map_len * (VIR_BITMAP_BITS_PER_UNIT / CHAR_BIT)); - - /* Ensure tail bits are clear. */ - if (tail) - bitmap->map[bitmap->map_len - 1] &= - -1UL >> (VIR_BITMAP_BITS_PER_UNIT - tail); -} - -/** - * virBitmapClearAll: - * @bitmap: the bitmap - * - * clear all bits in @bitmap. - */ -void virBitmapClearAll(virBitmapPtr bitmap) -{ - memset(bitmap->map, 0, - bitmap->map_len * (VIR_BITMAP_BITS_PER_UNIT / CHAR_BIT)); -} - -/** - * virBitmapIsAllSet: - * @bitmap: the bitmap to check - * - * check if all bits in @bitmap are set. - */ -bool virBitmapIsAllSet(virBitmapPtr bitmap) -{ - int i; - int unusedBits; - size_t sz; - - unusedBits = bitmap->map_len * VIR_BITMAP_BITS_PER_UNIT - bitmap->max_bit; - - sz = bitmap->map_len; - if (unusedBits > 0) - sz--; - - for (i = 0; i < sz; i++) - if (bitmap->map[i] != -1) - return false; - - if (unusedBits > 0) { - if ((bitmap->map[sz] & ((1UL << (VIR_BITMAP_BITS_PER_UNIT - unusedBits)) - 1)) - != ((1UL << (VIR_BITMAP_BITS_PER_UNIT - unusedBits)) - 1)) - return false; - } - - return true; -} - -/** - * virBitmapNextSetBit: - * @bitmap: the bitmap - * @pos: the position after which to search for a set bit - * - * search the first set bit after position @pos in bitmap @bitmap. - * @pos can be -1 to search for the first set bit. Position starts - * at 0. - * - * returns the position of the found bit, or -1 if no bit found. - */ -ssize_t virBitmapNextSetBit(virBitmapPtr bitmap, ssize_t pos) -{ - size_t nl; - size_t nb; - unsigned long bits; - - if (pos < 0) - pos = -1; - - pos++; - - if (pos >= bitmap->max_bit) - return -1; - - nl = pos / VIR_BITMAP_BITS_PER_UNIT; - nb = pos % VIR_BITMAP_BITS_PER_UNIT; - - bits = bitmap->map[nl] & ~((1UL << nb) - 1); - - while (bits == 0 && ++nl < bitmap->map_len) { - bits = bitmap->map[nl]; - } - - if (bits == 0) - return -1; - - return ffsl(bits) - 1 + nl * VIR_BITMAP_BITS_PER_UNIT; -} - -/* Return the number of bits currently set in the map. */ -size_t -virBitmapCountBits(virBitmapPtr bitmap) -{ - size_t i; - size_t ret = 0; - - for (i = 0; i < bitmap->map_len; i++) - ret += count_one_bits_l(bitmap->map[i]); - - return ret; -} diff --git a/src/util/bitmap.h b/src/util/bitmap.h deleted file mode 100644 index 346a1fb..0000000 --- a/src/util/bitmap.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - * bitmap.h: Simple bitmap operations - * - * Copyright (C) 2012 Red Hat, Inc. - * Copyright (C) 2010 Novell, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see - * <http://www.gnu.org/licenses/>. - * - * Author: Jim Fehlig <jfehlig@xxxxxxxxxx> - */ - -#ifndef __BITMAP_H__ -# define __BITMAP_H__ - -# include "internal.h" - -# include <sys/types.h> - - -typedef struct _virBitmap virBitmap; -typedef virBitmap *virBitmapPtr; - -/* - * Allocate a bitmap capable of containing @size bits. - */ -virBitmapPtr virBitmapNew(size_t size) ATTRIBUTE_RETURN_CHECK; - -/* - * Free previously allocated bitmap - */ -void virBitmapFree(virBitmapPtr bitmap); - -/* - * Copy all bits from @src to @dst. The bitmap sizes - * must be the same - */ -int virBitmapCopy(virBitmapPtr dst, virBitmapPtr src); - -/* - * Set bit position @b in @bitmap - */ -int virBitmapSetBit(virBitmapPtr bitmap, size_t b) - ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; - -/* - * Clear bit position @b in @bitmap - */ -int virBitmapClearBit(virBitmapPtr bitmap, size_t b) - ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; - -/* - * Get setting of bit position @b in @bitmap and store in @result - */ -int virBitmapGetBit(virBitmapPtr bitmap, size_t b, bool *result) - ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK; - -char *virBitmapString(virBitmapPtr bitmap) - ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; - -char *virBitmapFormat(virBitmapPtr bitmap) - ATTRIBUTE_NONNULL(1); - -int virBitmapParse(const char *str, - char sep, - virBitmapPtr *bitmap, - size_t bitmapSize) - ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3); - -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); - -bool virBitmapEqual(virBitmapPtr b1, virBitmapPtr b2) - ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); - -size_t virBitmapSize(virBitmapPtr bitmap) - ATTRIBUTE_NONNULL(1); - -void virBitmapSetAll(virBitmapPtr bitmap) - ATTRIBUTE_NONNULL(1); - -void virBitmapClearAll(virBitmapPtr bitmap) - ATTRIBUTE_NONNULL(1); - -bool virBitmapIsAllSet(virBitmapPtr bitmap) - ATTRIBUTE_NONNULL(1); - -ssize_t virBitmapNextSetBit(virBitmapPtr bitmap, ssize_t pos) - ATTRIBUTE_NONNULL(1); - -size_t virBitmapCountBits(virBitmapPtr bitmap) - ATTRIBUTE_NONNULL(1); - -#endif diff --git a/src/util/dnsmasq.c b/src/util/dnsmasq.c index e8eab1e..74593c8 100644 --- a/src/util/dnsmasq.c +++ b/src/util/dnsmasq.c @@ -39,7 +39,7 @@ #include "internal.h" #include "datatypes.h" -#include "bitmap.h" +#include "virbitmap.h" #include "dnsmasq.h" #include "util.h" #include "command.h" diff --git a/src/util/processinfo.h b/src/util/processinfo.h index 116c092..0ae23c6 100644 --- a/src/util/processinfo.h +++ b/src/util/processinfo.h @@ -23,7 +23,7 @@ # define __VIR_PROCESSINFO_H__ # include "internal.h" -# include "bitmap.h" +# include "virbitmap.h" int virProcessInfoSetAffinity(pid_t pid, virBitmapPtr map); diff --git a/src/util/virbitmap.c b/src/util/virbitmap.c new file mode 100644 index 0000000..0f13389 --- /dev/null +++ b/src/util/virbitmap.c @@ -0,0 +1,636 @@ +/* + * bitmap.h: Simple bitmap operations + * + * Copyright (C) 2010-2012 Red Hat, Inc. + * Copyright (C) 2010 Novell, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * <http://www.gnu.org/licenses/>. + * + * Author: Jim Fehlig <jfehlig@xxxxxxxxxx> + */ + +#include <config.h> + +#include <limits.h> +#include <stdint.h> +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <sys/types.h> + +#include "virbitmap.h" +#include "memory.h" +#include "buf.h" +#include "util.h" +#include "c-ctype.h" +#include "count-one-bits.h" + + +struct _virBitmap { + size_t max_bit; + size_t map_len; + unsigned long *map; +}; + + +#define VIR_BITMAP_BITS_PER_UNIT ((int) sizeof(unsigned long) * CHAR_BIT) +#define VIR_BITMAP_UNIT_OFFSET(b) ((b) / VIR_BITMAP_BITS_PER_UNIT) +#define VIR_BITMAP_BIT_OFFSET(b) ((b) % VIR_BITMAP_BITS_PER_UNIT) +#define VIR_BITMAP_BIT(b) (1UL << VIR_BITMAP_BIT_OFFSET(b)) + + +/** + * virBitmapNew: + * @size: number of bits + * + * Allocate a bitmap capable of containing @size bits. + * + * Returns a pointer to the allocated bitmap or NULL if + * memory cannot be allocated. + */ +virBitmapPtr virBitmapNew(size_t size) +{ + virBitmapPtr bitmap; + size_t sz; + + if (SIZE_MAX - VIR_BITMAP_BITS_PER_UNIT < size || size == 0) + return NULL; + + sz = (size + VIR_BITMAP_BITS_PER_UNIT - 1) / + VIR_BITMAP_BITS_PER_UNIT; + + if (VIR_ALLOC(bitmap) < 0) + return NULL; + + if (VIR_ALLOC_N(bitmap->map, sz) < 0) { + VIR_FREE(bitmap); + return NULL; + } + + bitmap->max_bit = size; + bitmap->map_len = sz; + return bitmap; +} + +/** + * virBitmapFree: + * @bitmap: previously allocated bitmap + * + * Free @bitmap previously allocated by virBitmapNew. + */ +void virBitmapFree(virBitmapPtr bitmap) +{ + if (bitmap) { + VIR_FREE(bitmap->map); + VIR_FREE(bitmap); + } +} + + +int virBitmapCopy(virBitmapPtr dst, virBitmapPtr src) +{ + if (dst->max_bit != src->max_bit) { + errno = EINVAL; + return -1; + } + + memcpy(dst->map, src->map, src->map_len * sizeof(src->map[0])); + + return 0; +} + + +/** + * virBitmapSetBit: + * @bitmap: Pointer to bitmap + * @b: bit position to set + * + * Set bit position @b in @bitmap + * + * Returns 0 on if bit is successfully set, -1 on error. + */ +int virBitmapSetBit(virBitmapPtr bitmap, size_t b) +{ + if (bitmap->max_bit <= b) + return -1; + + bitmap->map[VIR_BITMAP_UNIT_OFFSET(b)] |= VIR_BITMAP_BIT(b); + return 0; +} + +/** + * virBitmapClearBit: + * @bitmap: Pointer to bitmap + * @b: bit position to clear + * + * Clear bit position @b in @bitmap + * + * Returns 0 on if bit is successfully clear, -1 on error. + */ +int virBitmapClearBit(virBitmapPtr bitmap, size_t b) +{ + if (bitmap->max_bit <= b) + return -1; + + bitmap->map[VIR_BITMAP_UNIT_OFFSET(b)] &= ~VIR_BITMAP_BIT(b); + return 0; +} + +/* Helper function. caller must ensure b < bitmap->max_bit */ +static bool virBitmapIsSet(virBitmapPtr bitmap, size_t b) +{ + return !!(bitmap->map[VIR_BITMAP_UNIT_OFFSET(b)] & VIR_BITMAP_BIT(b)); +} + +/** + * virBitmapGetBit: + * @bitmap: Pointer to bitmap + * @b: bit position to get + * @result: bool pointer to receive bit setting + * + * Get setting of bit position @b in @bitmap and store in @result + * + * On success, @result will contain the setting of @b and 0 is + * returned. On failure, -1 is returned and @result is unchanged. + */ +int virBitmapGetBit(virBitmapPtr bitmap, size_t b, bool *result) +{ + if (bitmap->max_bit <= b) + return -1; + + *result = virBitmapIsSet(bitmap, b); + return 0; +} + +/** + * virBitmapString: + * @bitmap: Pointer to bitmap + * + * Convert @bitmap to printable string. + * + * Returns pointer to the string or NULL on error. + */ +char *virBitmapString(virBitmapPtr bitmap) +{ + virBuffer buf = VIR_BUFFER_INITIALIZER; + size_t sz; + + virBufferAddLit(&buf, "0x"); + + sz = bitmap->map_len; + + while (sz--) { + virBufferAsprintf(&buf, "%0*lx", + VIR_BITMAP_BITS_PER_UNIT / 4, + bitmap->map[sz]); + } + + if (virBufferError(&buf)) { + virBufferFreeAndReset(&buf); + return NULL; + } + + return virBufferContentAndReset(&buf); +} + +/** + * virBitmapFormat: + * @bitmap: the bitmap + * + * This function is the counterpart of virBitmapParse. This function creates + * a human-readable string representing the bits in bitmap. + * + * See virBitmapParse for the format of @str. + * + * Returns the string on success or NULL otherwise. Caller should call + * VIR_FREE to free the string. + */ +char *virBitmapFormat(virBitmapPtr bitmap) +{ + virBuffer buf = VIR_BUFFER_INITIALIZER; + bool first = true; + int start, cur, prev; + + if (!bitmap) + return NULL; + + cur = virBitmapNextSetBit(bitmap, -1); + if (cur < 0) + return strdup(""); + + start = prev = cur; + while (prev >= 0) { + cur = virBitmapNextSetBit(bitmap, prev); + + if (cur == prev + 1) { + prev = cur; + continue; + } + + /* cur < 0 or cur > prev + 1 */ + + if (!first) + virBufferAddLit(&buf, ","); + else + first = false; + + if (prev == start) + virBufferAsprintf(&buf, "%d", start); + else + virBufferAsprintf(&buf, "%d-%d", start, prev); + + start = prev = cur; + } + + if (virBufferError(&buf)) { + virBufferFreeAndReset(&buf); + return NULL; + } + + return virBufferContentAndReset(&buf); +} + +/** + * virBitmapParse: + * @str: points to a string representing a human-readable bitmap + * @bitmap: a bitmap created from @str + * @bitmapSize: the upper limit of num of bits in created bitmap + * + * This function is the counterpart of virBitmapFormat. This function creates + * a bitmap, in which bits are set according to the content of @str. + * + * @str is a comma separated string of fields N, which means a number of bit + * to set, and ^N, which means to unset the bit, and N-M for ranges of bits + * to set. + * + * Returns the number of bits set in @bitmap, or -1 in case of error. + */ + +int virBitmapParse(const char *str, + char sep, + virBitmapPtr *bitmap, + size_t bitmapSize) +{ + int ret = 0; + bool neg = false; + const char *cur; + char *tmp; + int i, start, last; + + if (!str) + return -1; + + cur = str; + virSkipSpaces(&cur); + + if (*cur == 0) + return -1; + + *bitmap = virBitmapNew(bitmapSize); + if (!*bitmap) + return -1; + + while (*cur != 0 && *cur != sep) { + /* + * 3 constructs are allowed: + * - N : a single CPU number + * - N-M : a range of CPU numbers with N < M + * - ^N : remove a single CPU number from the current set + */ + if (*cur == '^') { + cur++; + neg = true; + } + + if (!c_isdigit(*cur)) + goto parse_error; + + if (virStrToLong_i(cur, &tmp, 10, &start) < 0) + goto parse_error; + if (start < 0) + goto parse_error; + + cur = tmp; + + virSkipSpaces(&cur); + + if (*cur == ',' || *cur == 0 || *cur == sep) { + if (neg) { + if (virBitmapIsSet(*bitmap, start)) { + ignore_value(virBitmapClearBit(*bitmap, start)); + ret--; + } + } else { + if (!virBitmapIsSet(*bitmap, start)) { + ignore_value(virBitmapSetBit(*bitmap, start)); + ret++; + } + } + } else if (*cur == '-') { + if (neg) + goto parse_error; + + cur++; + virSkipSpaces(&cur); + + if (virStrToLong_i(cur, &tmp, 10, &last) < 0) + goto parse_error; + if (last < start) + goto parse_error; + + cur = tmp; + + for (i = start; i <= last; i++) { + if (!virBitmapIsSet(*bitmap, i)) { + ignore_value(virBitmapSetBit(*bitmap, i)); + ret++; + } + } + + virSkipSpaces(&cur); + } + + if (*cur == ',') { + cur++; + virSkipSpaces(&cur); + neg = false; + } else if (*cur == 0 || *cur == sep) { + break; + } else { + goto parse_error; + } + } + + return ret; + +parse_error: + virBitmapFree(*bitmap); + *bitmap = NULL; + return -1; +} + +/** + * virBitmapNewCopy: + * @src: the source bitmap. + * + * Makes a copy of bitmap @src. + * + * returns the copied bitmap on success, or NULL otherwise. Caller + * should call virBitmapFree to free the returned bitmap. + */ +virBitmapPtr virBitmapNewCopy(virBitmapPtr src) +{ + virBitmapPtr dst; + + if ((dst = virBitmapNew(src->max_bit)) == NULL) + return NULL; + + if (virBitmapCopy(dst, src) != 0) { + virBitmapFree(dst); + return NULL; + } + + return dst; +} + +/** + * virBitmapNewData: + * @data: the data + * @len: length of @data in bytes + * + * Allocate a bitmap from a chunk of data containing bits + * information + * + * Returns a pointer to the allocated bitmap or NULL if + * memory cannot be allocated. + */ +virBitmapPtr virBitmapNewData(void *data, int len) +{ + virBitmapPtr bitmap; + int i, j; + unsigned long *p; + unsigned char *bytes = data; + + bitmap = virBitmapNew(len * CHAR_BIT); + if (!bitmap) + return NULL; + + /* le64toh is not provided by gnulib, so we do the conversion by hand */ + p = bitmap->map; + for (i = j = 0; i < len; i++, j++) { + if (j == sizeof(*p)) { + j = 0; + p++; + } + *p |= (unsigned long) bytes[i] << (j * CHAR_BIT); + } + + return bitmap; +} + +/** + * virBitmapToData: + * @data: the data + * @len: len of @data in byte + * + * Convert a bitmap to a chunk of data containing bits information. + * Data consists of sequential bytes, with lower bytes containing + * lower bits. + * + * Returns 0 on success, -1 otherwise. + */ +int virBitmapToData(virBitmapPtr bitmap, unsigned char **data, int *dataLen) +{ + int len; + unsigned long *l; + int 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; + + /* htole64 is not provided by gnulib, so we do the conversion by hand */ + l = bitmap->map; + for (i = j = 0; i < len; i++, j++) { + if (j == sizeof(*l)) { + j = 0; + l++; + } + bytes[i] = *l >> (j * CHAR_BIT); + } + + return 0; +} + +/** + * virBitmapEqual: + * @b1: bitmap 1 + * @b2: bitmap 2 + * + * Compares two bitmaps, whose lengths can be different from each other. + * + * Returns true if two bitmaps have exactly the same set of bits set, + * otherwise false. + */ +bool virBitmapEqual(virBitmapPtr b1, virBitmapPtr b2) +{ + virBitmapPtr tmp; + int i; + + if (b1->max_bit > b2->max_bit) { + tmp = b1; + b1 = b2; + b2 = tmp; + } + + /* Now b1 is the smaller one, if not equal */ + + for (i = 0; i < b1->map_len; i++) { + if (b1->map[i] != b2->map[i]) + return false; + } + + for (; i < b2->map_len; i++) { + if (b2->map[i]) + return false; + } + + return true; +} + +size_t virBitmapSize(virBitmapPtr bitmap) +{ + return bitmap->max_bit; +} + +/** + * virBitmapSetAll: + * @bitmap: the bitmap + * + * set all bits in @bitmap. + */ +void virBitmapSetAll(virBitmapPtr bitmap) +{ + int tail = bitmap->max_bit % VIR_BITMAP_BITS_PER_UNIT; + + memset(bitmap->map, 0xff, + bitmap->map_len * (VIR_BITMAP_BITS_PER_UNIT / CHAR_BIT)); + + /* Ensure tail bits are clear. */ + if (tail) + bitmap->map[bitmap->map_len - 1] &= + -1UL >> (VIR_BITMAP_BITS_PER_UNIT - tail); +} + +/** + * virBitmapClearAll: + * @bitmap: the bitmap + * + * clear all bits in @bitmap. + */ +void virBitmapClearAll(virBitmapPtr bitmap) +{ + memset(bitmap->map, 0, + bitmap->map_len * (VIR_BITMAP_BITS_PER_UNIT / CHAR_BIT)); +} + +/** + * virBitmapIsAllSet: + * @bitmap: the bitmap to check + * + * check if all bits in @bitmap are set. + */ +bool virBitmapIsAllSet(virBitmapPtr bitmap) +{ + int i; + int unusedBits; + size_t sz; + + unusedBits = bitmap->map_len * VIR_BITMAP_BITS_PER_UNIT - bitmap->max_bit; + + sz = bitmap->map_len; + if (unusedBits > 0) + sz--; + + for (i = 0; i < sz; i++) + if (bitmap->map[i] != -1) + return false; + + if (unusedBits > 0) { + if ((bitmap->map[sz] & ((1UL << (VIR_BITMAP_BITS_PER_UNIT - unusedBits)) - 1)) + != ((1UL << (VIR_BITMAP_BITS_PER_UNIT - unusedBits)) - 1)) + return false; + } + + return true; +} + +/** + * virBitmapNextSetBit: + * @bitmap: the bitmap + * @pos: the position after which to search for a set bit + * + * search the first set bit after position @pos in bitmap @bitmap. + * @pos can be -1 to search for the first set bit. Position starts + * at 0. + * + * returns the position of the found bit, or -1 if no bit found. + */ +ssize_t virBitmapNextSetBit(virBitmapPtr bitmap, ssize_t pos) +{ + size_t nl; + size_t nb; + unsigned long bits; + + if (pos < 0) + pos = -1; + + pos++; + + if (pos >= bitmap->max_bit) + return -1; + + nl = pos / VIR_BITMAP_BITS_PER_UNIT; + nb = pos % VIR_BITMAP_BITS_PER_UNIT; + + bits = bitmap->map[nl] & ~((1UL << nb) - 1); + + while (bits == 0 && ++nl < bitmap->map_len) { + bits = bitmap->map[nl]; + } + + if (bits == 0) + return -1; + + return ffsl(bits) - 1 + nl * VIR_BITMAP_BITS_PER_UNIT; +} + +/* Return the number of bits currently set in the map. */ +size_t +virBitmapCountBits(virBitmapPtr bitmap) +{ + size_t i; + size_t ret = 0; + + for (i = 0; i < bitmap->map_len; i++) + ret += count_one_bits_l(bitmap->map[i]); + + return ret; +} diff --git a/src/util/virbitmap.h b/src/util/virbitmap.h new file mode 100644 index 0000000..346a1fb --- /dev/null +++ b/src/util/virbitmap.h @@ -0,0 +1,109 @@ +/* + * bitmap.h: Simple bitmap operations + * + * Copyright (C) 2012 Red Hat, Inc. + * Copyright (C) 2010 Novell, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * <http://www.gnu.org/licenses/>. + * + * Author: Jim Fehlig <jfehlig@xxxxxxxxxx> + */ + +#ifndef __BITMAP_H__ +# define __BITMAP_H__ + +# include "internal.h" + +# include <sys/types.h> + + +typedef struct _virBitmap virBitmap; +typedef virBitmap *virBitmapPtr; + +/* + * Allocate a bitmap capable of containing @size bits. + */ +virBitmapPtr virBitmapNew(size_t size) ATTRIBUTE_RETURN_CHECK; + +/* + * Free previously allocated bitmap + */ +void virBitmapFree(virBitmapPtr bitmap); + +/* + * Copy all bits from @src to @dst. The bitmap sizes + * must be the same + */ +int virBitmapCopy(virBitmapPtr dst, virBitmapPtr src); + +/* + * Set bit position @b in @bitmap + */ +int virBitmapSetBit(virBitmapPtr bitmap, size_t b) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; + +/* + * Clear bit position @b in @bitmap + */ +int virBitmapClearBit(virBitmapPtr bitmap, size_t b) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; + +/* + * Get setting of bit position @b in @bitmap and store in @result + */ +int virBitmapGetBit(virBitmapPtr bitmap, size_t b, bool *result) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK; + +char *virBitmapString(virBitmapPtr bitmap) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; + +char *virBitmapFormat(virBitmapPtr bitmap) + ATTRIBUTE_NONNULL(1); + +int virBitmapParse(const char *str, + char sep, + virBitmapPtr *bitmap, + size_t bitmapSize) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3); + +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); + +bool virBitmapEqual(virBitmapPtr b1, virBitmapPtr b2) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); + +size_t virBitmapSize(virBitmapPtr bitmap) + ATTRIBUTE_NONNULL(1); + +void virBitmapSetAll(virBitmapPtr bitmap) + ATTRIBUTE_NONNULL(1); + +void virBitmapClearAll(virBitmapPtr bitmap) + ATTRIBUTE_NONNULL(1); + +bool virBitmapIsAllSet(virBitmapPtr bitmap) + ATTRIBUTE_NONNULL(1); + +ssize_t virBitmapNextSetBit(virBitmapPtr bitmap, ssize_t pos) + ATTRIBUTE_NONNULL(1); + +size_t virBitmapCountBits(virBitmapPtr bitmap) + ATTRIBUTE_NONNULL(1); + +#endif diff --git a/tests/virbitmaptest.c b/tests/virbitmaptest.c index af94dab..db76672 100644 --- a/tests/virbitmaptest.c +++ b/tests/virbitmaptest.c @@ -21,7 +21,7 @@ #include "testutils.h" -#include "bitmap.h" +#include "virbitmap.h" static int test1(const void *data ATTRIBUTE_UNUSED) { diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 561e0e7..765f30c 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -37,7 +37,7 @@ #include <libxml/xmlsave.h> #include "internal.h" -#include "bitmap.h" +#include "virbitmap.h" #include "buf.h" #include "c-ctype.h" #include "conf/domain_conf.h" diff --git a/tools/virsh.c b/tools/virsh.c index 465cb44..2f7d4a3 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -69,7 +69,7 @@ #include "command.h" #include "virkeycode.h" #include "virnetdevbandwidth.h" -#include "util/bitmap.h" +#include "virbitmap.h" #include "conf/domain_conf.h" #include "virtypedparam.h" -- 1.7.11.7 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list