summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQuentin Young <qlyoung@cumulusnetworks.com>2017-07-11 11:14:09 -0400
committerQuentin Young <qlyoung@cumulusnetworks.com>2017-07-11 14:43:50 -0400
commit62c3d0260cb8820ab50dc2ec28d9b0dd95b0690f (patch)
treea0ba4f2519e2e0a6d9de6b505c583279fe8e825c
parent1c95bad18a0256bc7f85db773a39bbc7484078de (diff)
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 <qlyoung@cumulusnetworks.com>
-rw-r--r--lib/hash.c9
-rw-r--r--lib/hash.h4
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