diff --git a/libs/libks/src/include/ks_platform.h b/libs/libks/src/include/ks_platform.h index 0b6a04c1af..1be538f8e4 100644 --- a/libs/libks/src/include/ks_platform.h +++ b/libs/libks/src/include/ks_platform.h @@ -52,6 +52,8 @@ KS_BEGIN_EXTERN_C #define _GNU_SOURCE #endif +#include + #if UINTPTR_MAX == 0xffffffffffffffff #define KS_64BIT 1 #endif diff --git a/libs/libks/src/ks_hash.c b/libs/libks/src/ks_hash.c index 961c154cda..a4d9dbf039 100644 --- a/libs/libks/src/ks_hash.c +++ b/libs/libks/src/ks_hash.c @@ -76,10 +76,19 @@ hash(ks_hash_t *h, void *k) { unsigned int i; - if (h->mode == KS_HASH_MODE_ARBITRARY) { + switch (h->mode) + { + case KS_HASH_MODE_ARBITRARY: i = ks_hash_default_arbitrary(k, h->keysize, 13); - } else { + break; + case KS_HASH_MODE_INT: + case KS_HASH_MODE_INT64: + case KS_HASH_MODE_PTR: + i = h->hashfn((void *)&k); + break; + default: i = h->hashfn(k); + break; } /* Aim to protect against poor hash functions by adding logic here @@ -332,11 +341,17 @@ ks_hash_count(ks_hash_t *h) static int key_equals(ks_hash_t *h, void *k1, void *k2) { - if (h->mode == KS_HASH_MODE_ARBITRARY) { + switch (h->mode) + { + case KS_HASH_MODE_ARBITRARY: return !memcmp(k1, k2, h->keysize); - } else { - return h->eqfn(k1, k2); + case KS_HASH_MODE_INT: + case KS_HASH_MODE_INT64: + case KS_HASH_MODE_PTR: + return h->eqfn(&k1, &k2); + default: break; } + return h->eqfn(k1, k2); } static void * _ks_hash_remove(ks_hash_t *h, void *k, unsigned int hashvalue, unsigned int index) { @@ -384,7 +399,7 @@ ks_hash_insert_ex(ks_hash_t *h, void *k, void *v, ks_hash_flag_t flags, ks_hash_ { struct entry *e; unsigned int hashvalue = hash(h, k); - unsigned index = indexFor(h->tablelength, hashvalue); + unsigned int index = indexFor(h->tablelength, hashvalue); ks_hash_write_lock(h); diff --git a/libs/libks/test/testhash.c b/libs/libks/test/testhash.c index 65670cba1e..fed4c7f801 100644 --- a/libs/libks/test/testhash.c +++ b/libs/libks/test/testhash.c @@ -68,7 +68,7 @@ static void *test2_thread(ks_thread_t *thread, void *data) int test2(void) { ks_thread_t *threads[MAX]; - int ttl = 1; + int ttl = 5; int runs = 5; ks_pool_t *pool; ks_hash_t *hash;