From: Pierre-Marc Fournier Date: Tue, 27 Apr 2010 20:08:09 +0000 (-0400) Subject: fix power of two computation X-Git-Tag: v1.9.1~604 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=a80e6dd803cfde798019825ae8858015fa702d6b;p=lttng-ust.git fix power of two computation --- diff --git a/libust/tracectl.c b/libust/tracectl.c index 39756a55..3624b867 100644 --- a/libust/tracectl.c +++ b/libust/tracectl.c @@ -456,18 +456,18 @@ static int do_cmd_get_subbuf_size(const char *recvbuf, struct ustcomm_source *sr return retval; } -static unsigned int poweroftwo(unsigned int x) -{ - unsigned int power2 = 1; - unsigned int hardcoded = 2147483648u; /* FIX max 2^31 */ - - if (x < 2) - return 2; +/* Return the power of two which is equal or higher to v */ - while (power2 < x && power2 < hardcoded) - power2 *= 2; - - return power2; +static unsigned int pow2_higher_or_eq(unsigned int v) +{ + int hb = fls(v); + int hbm1 = hb-1; + int retval = 1<<(hb-1); + + if(v-retval == 0) + return retval; + else + return retval<<1; } static int do_cmd_set_subbuf_size(const char *recvbuf, struct ustcomm_source *src) @@ -491,9 +491,10 @@ static int do_cmd_set_subbuf_size(const char *recvbuf, struct ustcomm_source *sr goto end; } - power = poweroftwo(size); + power = pow2_higher_or_eq(size); + power = max_t(unsigned int, 2u, power); if (power != size) - WARN("using the next 2^n = %u\n", power); + WARN("using the next power of two for buffer size = %u\n", power); ltt_lock_traces(); trace = _ltt_trace_find_setup(trace_name);