Define a LH_LOAD_FACTOR constant and note the range that it can be set to.
authorEric Haszlakiewicz <erh+git@nimenees.com>
Sat, 31 Mar 2012 22:33:58 +0000 (17:33 -0500)
committerKeith Derrick <keith.derrick@palm.com>
Mon, 2 Apr 2012 14:53:25 +0000 (07:53 -0700)
Change the resize check from "count > size" to "count >= size" to avoid a
potential infinite loop with high load factors and a full hash table.

linkhash.c
linkhash.h

index 3a9ba0e..88c0a7c 100644 (file)
@@ -125,7 +125,7 @@ int lh_table_insert(struct lh_table *t, void *k, const void *v)
        unsigned long h, n;
 
        t->inserts++;
-       if(t->count > t->size * 0.66) lh_table_resize(t, t->size * 2);
+       if(t->count >= t->size * LH_LOAD_FACTOR) lh_table_resize(t, t->size * 2);
 
        h = t->hash_fn(k);
        n = h % t->size;
index 90f219d..9d89460 100644 (file)
@@ -22,6 +22,13 @@ extern "C" {
 #define LH_PRIME 0x9e370001UL
 
 /**
+ * The fraction of filled hash buckets until an insert will cause the table
+ * to be resized.  
+ * This can range from just above 0 up to 1.0.
+ */
+#define LH_LOAD_FACTOR 0.66
+
+/**
  * sentinel pointer value for empty slots
  */
 #define LH_EMPTY (void*)-1