]> granicus.if.org Git - json-c/commitdiff
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 3a9ba0e08f4d678f17d59010f802330a3f6dc92d..88c0a7cfe8db54fdcaf4651690988d81aa936717 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 90f219df36b1a77fd2f14d4bacc1c78361608f81..9d894604c1121be8cecbaf15381ca73699787685 100644 (file)
@@ -21,6 +21,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
  */