From 62c3d0260cb8820ab50dc2ec28d9b0dd95b0690f Mon Sep 17 00:00:00 2001 From: Quentin Young Date: Tue, 11 Jul 2017 11:14:09 -0400 Subject: [PATCH] lib: use 32-bit atomics, s/pow/mul Some platforms don't support 64-bit atomics, missed converting a floating point pow() to an integral mul when changing SD algo. Signed-off-by: Quentin Young --- lib/hash.c | 9 ++------- lib/hash.h | 4 ++-- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/lib/hash.c b/lib/hash.c index 95643bbae0..57a07b5f8e 100644 --- a/lib/hash.c +++ b/lib/hash.c @@ -87,13 +87,8 @@ hash_alloc_intern (void *arg) } #define hash_update_ssq(hz, old, new) \ - do { \ - long double res; \ - res = powl(old, 2.0); \ - hz->stats.ssq -= (uint64_t) res;\ - res = powl(new, 2.0); \ - hz->stats.ssq += (uint64_t) res; \ - } while (0); \ + atomic_fetch_add_explicit(&hz->stats.ssq, (new + old)*(new - old),\ + memory_order_relaxed); /* Expand hash if the chain length exceeds the threshold. */ static void hash_expand (struct hash *hash) diff --git a/lib/hash.h b/lib/hash.h index 01d2b1ddc8..3b2671afae 100644 --- a/lib/hash.h +++ b/lib/hash.h @@ -53,9 +53,9 @@ struct hash_backet struct hashstats { /* number of empty hash buckets */ - _Atomic int empty; + _Atomic uint_fast32_t empty; /* sum of squares of bucket length */ - _Atomic uint64_t ssq; + _Atomic uint_fast32_t ssq; }; struct hash