diff src/hashtable.c @ 123:f67f8a8d81ba

updated for version 7.0043
author vimboss
date Fri, 21 Jan 2005 11:55:25 +0000
parents 34423a71d203
children b5fc81a825a1
line wrap: on
line diff
--- a/src/hashtable.c
+++ b/src/hashtable.c
@@ -73,19 +73,17 @@ hash_init(ht)
     ht->ht_mask = HT_INIT_SIZE - 1;
 }
 
-#if 0  /* not used */
 /*
- * Free a hash table.  Does not free the items it contains!
+ * Free the array of a hash table.  Does not free the items it contains!
+ * If "ht" is not freed then you should call hash_init() next!
  */
     void
-hash_free(ht)
+hash_clear(ht)
     hashtable *ht;
 {
     if (ht->ht_array != ht->ht_smallarray)
 	vim_free(ht->ht_array);
-    vim_free(ht);
 }
-#endif
 
 /*
  * Find "key" in hashtable "ht".  "key" must not be NULL.
@@ -228,8 +226,8 @@ hash_set(hi, key)
 
 /*
  * Remove item "hi" from  hashtable "ht".  "hi" must have been obtained with
- * hash_lookup() and point to a used empty item.
- * The caller must take care of freeing the item.
+ * hash_lookup() and point to an empty item.
+ * The caller must take care of freeing the item itself.
  */
     void
 hash_remove(ht, hi)
@@ -242,6 +240,31 @@ hash_remove(ht, hi)
 }
 
 /*
+ * Lock a hashtable: prevent that ht_array changes.
+ * Don't use this when items are to be added!
+ * Must call hash_unlock() later.
+ */
+    void
+hash_lock(ht)
+    hashtable	*ht;
+{
+    ++ht->ht_locked;
+}
+
+/*
+ * Unlock a hashtable: allow ht_array changes again.
+ * Table will be resized (shrink) when necessary.
+ * This must balance a call to hash_lock().
+ */
+    void
+hash_unlock(ht)
+    hashtable	*ht;
+{
+    --ht->ht_locked;
+    (void)hash_may_resize(ht);
+}
+
+/*
  * Shrink a hashtable when there is too much empty space.
  * Grow a hashtable when there is not enough empty space.
  * Returns OK or FAIL (out of memory).
@@ -260,6 +283,10 @@ hash_may_resize(ht)
     long_u	newmask;
     long_u	perturb;
 
+    /* Don't resize a locked table. */
+    if (ht->ht_locked > 0)
+	return OK;
+
 #ifdef HT_DEBUG
     if (ht->ht_used > ht->ht_filled)
 	EMSG("hash_may_resize(): more used than filled");
@@ -282,7 +309,7 @@ hash_may_resize(ht)
     if (ht->ht_filled * 3 < oldsize * 2 && ht->ht_used > oldsize / 5)
 	return OK;
 
-    if (ht->ht_used > 10000)
+    if (ht->ht_used > 1000)
 	minsize = ht->ht_used * 2;  /* it's big, don't make too much room */
     else
 	minsize = ht->ht_used * 4;  /* make plenty of room */