diff options
Diffstat (limited to 'libglusterfs/src')
| -rw-r--r-- | libglusterfs/src/common-utils.c | 24 | ||||
| -rw-r--r-- | libglusterfs/src/common-utils.h | 10 | 
2 files changed, 34 insertions, 0 deletions
diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c index 7669b6b4ca3..bd356f6f195 100644 --- a/libglusterfs/src/common-utils.c +++ b/libglusterfs/src/common-utils.c @@ -4129,3 +4129,27 @@ gf_zero_fill_stat (struct iatt *buf)          buf->ia_nlink = 0;          buf->ia_ctime = 0;  } + +int +gf_bits_count (uint64_t n) +{ +        int val = 0; +#ifdef _GNU_SOURCE +        val = __builtin_popcountll (n); +#else +        n -= (n >> 1) & 0x5555555555555555ULL; +        n = ((n >> 2) & 0x3333333333333333ULL) + (n & 0x3333333333333333ULL); +        n = (n + (n >> 4)) & 0x0F0F0F0F0F0F0F0FULL; +        n += n >> 8; +        n += n >> 16; +        n += n >> 32; +        val = n & 0xFF; +#endif +        return val; +} + +int +gf_bits_index (uint64_t n) +{ +    return ffsll(n) - 1; +} diff --git a/libglusterfs/src/common-utils.h b/libglusterfs/src/common-utils.h index 5b330053208..fc6908e5923 100644 --- a/libglusterfs/src/common-utils.h +++ b/libglusterfs/src/common-utils.h @@ -30,6 +30,10 @@  #include <limits.h>  #include <fnmatch.h> +#ifndef ffsll +#define ffsll(x) __builtin_ffsll(x) +#endif +  void trap (void);  #define GF_UNIVERSAL_ANSWER 42    /* :O */ @@ -799,4 +803,10 @@ gf_is_zero_filled_stat (struct iatt *buf);  void  gf_zero_fill_stat (struct iatt *buf); +int32_t +gf_bits_count (uint64_t n); + +int32_t +gf_bits_index (uint64_t n); +  #endif /* _COMMON_UTILS_H */  | 
