There are two special cases, if the input number is 0 or the number
is
larger then 2^31 (for 32bit unsigned int). For the special cases the
return value is 0 because they cannot be rounded.
Resolves:
https://bugzilla.redhat.com/show_bug.cgi?id=1076098
Signed-off-by: Pavel Hrdina <phrdina(a)redhat.com>
---
bootstrap.conf | 1 +
src/internal.h | 7 +++++++
tests/utiltest.c | 39 +++++++++++++++++++++++++++++++++++++++
3 files changed, 47 insertions(+)
diff --git a/bootstrap.conf b/bootstrap.conf
index d24a714..e7ea9c9 100644
--- a/bootstrap.conf
+++ b/bootstrap.conf
@@ -35,6 +35,7 @@ clock-time
close
connect
configmake
+count-leading-zeros
count-one-bits
crypto/md5
crypto/sha256
diff --git a/src/internal.h b/src/internal.h
index f6a88b2..765b853 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -62,6 +62,7 @@
# include "c-strcase.h"
# include "ignore-value.h"
+# include "count-leading-zeros.h"
/* On architectures which lack these limits, define them (ie. Cygwin).
* Note that the libvirt code should be robust enough to handle the
@@ -382,6 +383,12 @@
/* round up value to the closest multiple of size */
# define VIR_ROUND_UP(value, size) (VIR_DIV_UP(value, size) * (size))
+/* Round up to the next closest power of 2. It will return rounded number or 0
+ * for 0 or number more than 2^31 (for 32bit unsigned int). */
+# define VIR_ROUND_UP_POWER_OF_TWO(value) \
+ ((value) > 0 && (value) <= 1U<<(sizeof(unsigned int)*8 - 1) ?
\
+ 1U<<(sizeof(unsigned int)*8 - count_leading_zeros((value) - 1)) : 0)
You should add spaces around the multiplication and shift operators to
comply with our coding style.
ACK with that changed.
Peter