[libvirt] [PATCH] random: link with -lm when needed

Use of ldexp() requires -lm on some platforms; use gnulib to determine this for our makefile. Also, optimize virRandomInt() for the case of a power-of-two limit (actually rather common, given that Daniel has a pending patch to replace virRandomBis(10) with code that will default to virRandomInt(1024) on default SELinux settings). * .gnulib: Update to latest, for ldexp. * bootstrap.conf (gnulib_modules): Import ldexp. * src/Makefile.am (libvirt_util_la_CFLAGS): Link with -lm when needed. * src/util/virrandom.c (virRandomInt): Optimize powers of 2. --- Gnulib changes: * .gnulib dbd9144...271dd74 (37):
ldexp: relax license update from texinfo gnulib-tool: Fix persistence of --witness-c-macro option. count-leading-zeros: use a lookup table on non-gcc compilers count-leading-zeros: new module maintainer-makefile: Fix syntax error with dash. extern-inline: also ignore -Wmissing-declarations autoupdate maint.mk: sc_prohibit_magic_number_exit: avoid new false positives gnumakefile: better interaction with Automake-NG base64: Use extern C scope in header file, for C++. stat-time, timespec, u64: support naive out-of-dir builds Fix typo: 'linline' -> 'inline' (thanks to Eric Blake). Keep the extern-inline macros closer together. Fix indenting. utimens: use extern-inline u64: use extern-inline timespec: use extern-inline stat-time: use extern-inline extern-inline: new module maint.mk: a "release-commit" wrapper to do-release-commit-and-tag autoupdate autoupdate maint.mk: use silent-rules support from Automake maint.mk: provide a web-manual-update target README-release: shorten the circuit to post a news gnu-web-doc-update: fix --help passfd: fix comment on recvfd maint.mk: avoid a sub-shell maint.mk: absolute VPATH issue update from texinfo gitlog-to-changelog: fix previous change gitlog-to-changelog: don't expect .git to be in $srcdir maint.mk: absolute VPATH build fix clean-temp: Fix memory leak. maint: fix grammar in a ChangeLog entry maint.mk: new rule: refresh-gnulib-patches
.gnulib | 2 +- bootstrap.conf | 1 + src/Makefile.am | 2 +- src/util/virrandom.c | 4 ++++ 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.gnulib b/.gnulib index dbd9144..271dd74 160000 --- a/.gnulib +++ b/.gnulib @@ -1 +1 @@ -Subproject commit dbd914496c99c52220e5f5ba4121d6cb55fb3beb +Subproject commit 271dd74fdf54ec2a03e73a5173b0b5697f6088f1 diff --git a/bootstrap.conf b/bootstrap.conf index a4e1c2f..a6cfe24 100644 --- a/bootstrap.conf +++ b/bootstrap.conf @@ -61,6 +61,7 @@ intprops ioctl isatty largefile +ldexp listen localeconv maintainer-makefile diff --git a/src/Makefile.am b/src/Makefile.am index e94f977..cec4789 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -654,7 +654,7 @@ libvirt_util_la_SOURCES = \ $(UTIL_SOURCES) libvirt_util_la_CFLAGS = $(CAPNG_CFLAGS) $(YAJL_CFLAGS) $(LIBNL_CFLAGS) \ $(AM_CFLAGS) $(AUDIT_CFLAGS) $(DEVMAPPER_CFLAGS) \ - $(DBUS_CFLAGS) + $(DBUS_CFLAGS) $(LDEXP_LIBM) libvirt_util_la_LIBADD = $(CAPNG_LIBS) $(YAJL_LIBS) $(LIBNL_LIBS) \ $(THREAD_LIBS) $(AUDIT_LIBS) $(DEVMAPPER_LIBS) \ $(RT_LIBS) $(DBUS_LIBS) $(MSCOM_LIBS) $(LIBXML_LIBS) diff --git a/src/util/virrandom.c b/src/util/virrandom.c index 363fcab..8870865 100644 --- a/src/util/virrandom.c +++ b/src/util/virrandom.c @@ -24,6 +24,7 @@ #include <stdlib.h> #include <inttypes.h> #include <math.h> +#include <strings.h> #include "virrandom.h" #include "threads.h" @@ -135,6 +136,9 @@ double virRandom(void) */ uint32_t virRandomInt(uint32_t max) { + if ((max & (max - 1)) == 0) + return virRandomBits(ffs(max)); + double val = virRandom(); return val * max; } -- 1.7.11.2

On 08/14/2012 01:44 PM, Eric Blake wrote: oops, hit send too soon
Use of ldexp() requires -lm on some platforms; use gnulib to determine this for our makefile. Also, optimize virRandomInt() for the case of a power-of-two limit (actually rather common, given that Daniel has a pending patch to replace virRandomBis(10) with code that will
s/Bis/Bits/
default to virRandomInt(1024) on default SELinux settings).
@@ -135,6 +136,9 @@ double virRandom(void) */ uint32_t virRandomInt(uint32_t max) { + if ((max & (max - 1)) == 0) + return virRandomBits(ffs(max));
ffs(max)-1 -- Eric Blake eblake@redhat.com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On 08/14/2012 03:44 PM, Eric Blake wrote:
Use of ldexp() requires -lm on some platforms; use gnulib to determine this for our makefile. Also, optimize virRandomInt() for the case of a power-of-two limit (actually rather common, given that Daniel has a pending patch to replace virRandomBis(10) with code that will default to virRandomInt(1024) on default SELinux settings).
ACK.

On 08/14/2012 02:02 PM, Laine Stump wrote:
On 08/14/2012 03:44 PM, Eric Blake wrote:
Use of ldexp() requires -lm on some platforms; use gnulib to determine this for our makefile. Also, optimize virRandomInt() for the case of a power-of-two limit (actually rather common, given that Daniel has a pending patch to replace virRandomBis(10) with code that will default to virRandomInt(1024) on default SELinux settings).
ACK.
Thanks; will push shortly. -- Eric Blake eblake@redhat.com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
participants (2)
-
Eric Blake
-
Laine Stump