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>
This commit is contained in:
Quentin Young 2017-07-11 11:14:09 -04:00
parent 1c95bad18a
commit 62c3d0260c
No known key found for this signature in database
GPG Key ID: DAF48E0F57E0834F
2 changed files with 4 additions and 9 deletions

View File

@ -87,13 +87,8 @@ hash_alloc_intern (void *arg)
} }
#define hash_update_ssq(hz, old, new) \ #define hash_update_ssq(hz, old, new) \
do { \ atomic_fetch_add_explicit(&hz->stats.ssq, (new + old)*(new - old),\
long double res; \ memory_order_relaxed);
res = powl(old, 2.0); \
hz->stats.ssq -= (uint64_t) res;\
res = powl(new, 2.0); \
hz->stats.ssq += (uint64_t) res; \
} while (0); \
/* Expand hash if the chain length exceeds the threshold. */ /* Expand hash if the chain length exceeds the threshold. */
static void hash_expand (struct hash *hash) static void hash_expand (struct hash *hash)

View File

@ -53,9 +53,9 @@ struct hash_backet
struct hashstats struct hashstats
{ {
/* number of empty hash buckets */ /* number of empty hash buckets */
_Atomic int empty; _Atomic uint_fast32_t empty;
/* sum of squares of bucket length */ /* sum of squares of bucket length */
_Atomic uint64_t ssq; _Atomic uint_fast32_t ssq;
}; };
struct hash struct hash