Fixes elf panic
[akaros.git] / kern / src / hashtable.c
index 5d1d25a..938d698 100644 (file)
@@ -96,7 +96,7 @@ create_hashtable(size_t minsize,
 }
 
 /*****************************************************************************/
-size_t
+static size_t
 hash(hashtable_t *h, void *k)
 {
     /* Aim to protect against poor hash functions by adding logic here
@@ -276,7 +276,8 @@ hashtable_destroy(hashtable_t *h)
 }
 
 /*****************************************************************************/
-/* hashtable_iterator    - iterator constructor
+/* hashtable_iterator    - iterator constructor, be sure to kfree this when
+ * you're done.
  *
  * If the htable isn't empty, e and index will refer to the first entry. */
 
@@ -424,6 +425,33 @@ hashtable_iterator_search(hashtable_itr_t *itr,
     return 0;
 }
 
+/* Runs func on each member of the hash table */
+void hash_for_each(struct hashtable *hash, void func(void*))
+{
+       if (hashtable_count(hash)) {
+               struct hashtable_itr *iter = hashtable_iterator(hash);
+               do {
+                       void *item = hashtable_iterator_value(iter);
+                       func(item);
+               } while (hashtable_iterator_advance(iter));
+               kfree(iter);
+       }
+}
+
+/* Runs func on each member of the hash table, removing the item after
+ * processing it.  Make sure func frees the item, o/w you'll leak. */
+void hash_for_each_remove(struct hashtable *hash, void func(void*))
+{
+       if (hashtable_count(hash)) {
+               struct hashtable_itr *iter = hashtable_iterator(hash);
+               do {
+                       void *item = hashtable_iterator_value(iter);
+                       func(item);
+               } while (hashtable_iterator_remove(iter));
+               kfree(iter);
+       }
+}
+
 /*
  * Copyright (c) 2002, 2004, Christopher Clark
  * All rights reserved.