[PATCH 0/3] util: json: Remove virBitmap from virJSON headers

virJSONValueGetArrayAsBitmap and virJSONValueNewArrayFromBitmap can be simplified and unexported. Peter Krempa (3): virQEMUBuildCommandLineJSONArrayBitmap: Open code bitmap conversion util: json: Remove virJSONValueGetArrayAsBitmap util: json: Remove virJSONValueNewArrayFromBitmap src/libvirt_private.syms | 2 - src/util/virjson.c | 83 +++++----------------------------------- src/util/virjson.h | 4 -- src/util/virqemu.c | 16 ++++++-- 4 files changed, 22 insertions(+), 83 deletions(-) -- 2.30.2

Add a simpler algorithm converting the JSON array to bitmap so that virJSONValueGetArrayAsBitmap can be removed in next step. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/util/virqemu.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/util/virqemu.c b/src/util/virqemu.c index a1f57dea66..4d432651ee 100644 --- a/src/util/virqemu.c +++ b/src/util/virqemu.c @@ -28,6 +28,7 @@ #include "virqemu.h" #include "virstring.h" #include "viralloc.h" +#include "virbitmap.h" #define VIR_FROM_THIS VIR_FROM_NONE @@ -59,10 +60,19 @@ virQEMUBuildCommandLineJSONArrayBitmap(const char *key, { ssize_t pos = -1; ssize_t end; - g_autoptr(virBitmap) bitmap = NULL; + g_autoptr(virBitmap) bitmap = virBitmapNew(0); + size_t i; - if (virJSONValueGetArrayAsBitmap(array, &bitmap) < 0) - return -1; + for (i = 0; i < virJSONValueArraySize(array); i++) { + virJSONValue *member = virJSONValueArrayGet(array, i); + unsigned long long value; + + if (virJSONValueGetNumberUlong(member, &value) < 0) + return -1; + + if (virBitmapSetBitExpand(bitmap, value) < 0) + return -1; + } while ((pos = virBitmapNextSetBit(bitmap, pos)) > -1) { if ((end = virBitmapNextClearBit(bitmap, pos)) < 0) -- 2.30.2

The function is not used. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/libvirt_private.syms | 1 - src/util/virjson.c | 51 ---------------------------------------- src/util/virjson.h | 2 -- 3 files changed, 54 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index f36400b5f6..0801728a74 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2478,7 +2478,6 @@ virJSONValueArraySteal; virJSONValueCopy; virJSONValueFree; virJSONValueFromString; -virJSONValueGetArrayAsBitmap; virJSONValueGetBoolean; virJSONValueGetNumberDouble; virJSONValueGetNumberInt; diff --git a/src/util/virjson.c b/src/util/virjson.c index 82081db870..746386c619 100644 --- a/src/util/virjson.c +++ b/src/util/virjson.c @@ -1174,57 +1174,6 @@ virJSONValueGetBoolean(virJSONValuePtr val, } -/** - * virJSONValueGetArrayAsBitmap: - * @val: JSON array to convert to bitmap - * @bitmap: New bitmap is allocated filled and returned via this argument - * - * Attempts a conversion of a JSON array to a bitmap. The members of the array - * must be non-negative integers for the conversion to succeed. This function - * does not report libvirt errors so that it can be used to probe that the - * array can be represented as a bitmap. - * - * Returns 0 on success and fills @bitmap; -1 on error and @bitmap is set to - * NULL. - */ -int -virJSONValueGetArrayAsBitmap(const virJSONValue *val, - virBitmapPtr *bitmap) -{ - virJSONValuePtr elem; - size_t i; - g_autofree unsigned long long *elems = NULL; - unsigned long long maxelem = 0; - - *bitmap = NULL; - - if (val->type != VIR_JSON_TYPE_ARRAY) - return -1; - - elems = g_new0(unsigned long long, val->data.array.nvalues); - - /* first pass converts array members to numbers and finds the maximum */ - for (i = 0; i < val->data.array.nvalues; i++) { - elem = val->data.array.values[i]; - - if (elem->type != VIR_JSON_TYPE_NUMBER || - virStrToLong_ullp(elem->data.number, NULL, 10, &elems[i]) < 0) - return -1; - - if (elems[i] > maxelem) - maxelem = elems[i]; - } - - *bitmap = virBitmapNew(maxelem + 1); - - /* second pass sets the correct bits in the map */ - for (i = 0; i < val->data.array.nvalues; i++) - ignore_value(virBitmapSetBit(*bitmap, elems[i])); - - return 0; -} - - virJSONValuePtr virJSONValueNewArrayFromBitmap(virBitmapPtr bitmap) { diff --git a/src/util/virjson.h b/src/util/virjson.h index c22bc1fb45..1f15b23233 100644 --- a/src/util/virjson.h +++ b/src/util/virjson.h @@ -107,8 +107,6 @@ int virJSONValueGetNumberLong(virJSONValuePtr object, long long *value); int virJSONValueGetNumberUlong(virJSONValuePtr object, unsigned long long *value); int virJSONValueGetNumberDouble(virJSONValuePtr object, double *value); int virJSONValueGetBoolean(virJSONValuePtr object, bool *value); -int virJSONValueGetArrayAsBitmap(const virJSONValue *val, virBitmapPtr *bitmap) - ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); bool virJSONValueIsNull(virJSONValuePtr object); virJSONValuePtr virJSONValueObjectGetObject(virJSONValuePtr object, const char *key); -- 2.30.2

The function is used only inside of the file. We can open-code it and remove it as it's not very useful. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/libvirt_private.syms | 1 - src/util/virjson.c | 32 +++++++++----------------------- src/util/virjson.h | 2 -- 3 files changed, 9 insertions(+), 26 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 0801728a74..fd2d4462a6 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2492,7 +2492,6 @@ virJSONValueIsArray; virJSONValueIsNull; virJSONValueIsObject; virJSONValueNewArray; -virJSONValueNewArrayFromBitmap; virJSONValueNewBoolean; virJSONValueNewNull; virJSONValueNewNumberDouble; diff --git a/src/util/virjson.c b/src/util/virjson.c index 746386c619..0eff467ec5 100644 --- a/src/util/virjson.c +++ b/src/util/virjson.c @@ -31,6 +31,7 @@ #include "virutil.h" #include "virbuffer.h" #include "virenum.h" +#include "virbitmap.h" #if WITH_YAJL # include <yajl/yajl_gen.h> @@ -304,7 +305,8 @@ virJSONValueObjectAddVArgs(virJSONValuePtr obj, case 'M': case 'm': { virBitmapPtr map = va_arg(args, virBitmapPtr); - g_autoptr(virJSONValue) jsonMap = NULL; + g_autoptr(virJSONValue) jsonMap = virJSONValueNewArray(); + ssize_t pos = -1; if (!map) { if (type == 'M') @@ -316,8 +318,12 @@ virJSONValueObjectAddVArgs(virJSONValuePtr obj, return -1; } - if (!(jsonMap = virJSONValueNewArrayFromBitmap(map))) - return -1; + while ((pos = virBitmapNextSetBit(map, pos)) > -1) { + g_autoptr(virJSONValue) newelem = virJSONValueNewNumberLong(pos); + + if (virJSONValueArrayAppend(jsonMap, &newelem) < 0) + return -1; + } if ((rc = virJSONValueObjectAppend(obj, key, &jsonMap)) < 0) return -1; @@ -1174,26 +1180,6 @@ virJSONValueGetBoolean(virJSONValuePtr val, } -virJSONValuePtr -virJSONValueNewArrayFromBitmap(virBitmapPtr bitmap) -{ - g_autoptr(virJSONValue) ret = virJSONValueNewArray(); - ssize_t pos = -1; - - if (!bitmap) - return g_steal_pointer(&ret); - - while ((pos = virBitmapNextSetBit(bitmap, pos)) > -1) { - g_autoptr(virJSONValue) newelem = virJSONValueNewNumberLong(pos); - - if (virJSONValueArrayAppend(ret, &newelem) < 0) - return NULL; - } - - return g_steal_pointer(&ret); -} - - bool virJSONValueIsNull(virJSONValuePtr val) { diff --git a/src/util/virjson.h b/src/util/virjson.h index 1f15b23233..3197f81f86 100644 --- a/src/util/virjson.h +++ b/src/util/virjson.h @@ -23,7 +23,6 @@ #pragma once #include "internal.h" -#include "virbitmap.h" #include "virbuffer.h" #include <stdarg.h> @@ -67,7 +66,6 @@ virJSONValuePtr virJSONValueNewBoolean(int boolean); virJSONValuePtr virJSONValueNewNull(void); virJSONValuePtr virJSONValueNewArray(void); virJSONValuePtr virJSONValueNewObject(void); -virJSONValuePtr virJSONValueNewArrayFromBitmap(virBitmapPtr bitmap); int virJSONValueObjectAppend(virJSONValuePtr object, const char *key, -- 2.30.2

On Fri, Apr 09, 2021 at 02:32:34PM +0200, Peter Krempa wrote:
virJSONValueGetArrayAsBitmap and virJSONValueNewArrayFromBitmap can be simplified and unexported.
Peter Krempa (3): virQEMUBuildCommandLineJSONArrayBitmap: Open code bitmap conversion util: json: Remove virJSONValueGetArrayAsBitmap util: json: Remove virJSONValueNewArrayFromBitmap
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
participants (2)
-
Pavel Hrdina
-
Peter Krempa