summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Pfaff <blp@nicira.com>2010-07-19 11:22:10 -0700
committerBen Pfaff <blp@nicira.com>2010-10-01 10:25:10 -0700
commitf3099647623f2b13ece56cf8cf31761c00c1c297 (patch)
tree24fb9d741ac963092c775ea3b7c6dff28ee0208e
parent93b13be8e65455ecf6e568e604cf76fdb20601c9 (diff)
downloadopenvswitch-f3099647623f2b13ece56cf8cf31761c00c1c297.tar.gz
hmap: New function hmap_clear().
-rw-r--r--lib/hmap.c17
-rw-r--r--lib/hmap.h1
2 files changed, 18 insertions, 0 deletions
diff --git a/lib/hmap.c b/lib/hmap.c
index 1b4816d9d..6bc5ea74b 100644
--- a/lib/hmap.c
+++ b/lib/hmap.c
@@ -18,6 +18,7 @@
#include "hmap.h"
#include <assert.h>
#include <stdint.h>
+#include <string.h>
#include "coverage.h"
#include "random.h"
#include "util.h"
@@ -42,6 +43,22 @@ hmap_destroy(struct hmap *hmap)
}
}
+/* Removes all node from 'hmap', leaving it ready to accept more nodes. Does
+ * not free memory allocated for 'hmap'.
+ *
+ * This function is appropriate when 'hmap' will soon have about as many
+ * elements as it before. If 'hmap' will likely have fewer elements than
+ * before, use hmap_destroy() followed by hmap_clear() to save memory and
+ * iteration time. */
+void
+hmap_clear(struct hmap *hmap)
+{
+ if (hmap->n > 0) {
+ hmap->n = 0;
+ memset(hmap->buckets, 0, (hmap->mask + 1) * sizeof *hmap->buckets);
+ }
+}
+
/* Exchanges hash maps 'a' and 'b'. */
void
hmap_swap(struct hmap *a, struct hmap *b)
diff --git a/lib/hmap.h b/lib/hmap.h
index d56749996..92aff7f99 100644
--- a/lib/hmap.h
+++ b/lib/hmap.h
@@ -69,6 +69,7 @@ struct hmap {
/* Initialization. */
void hmap_init(struct hmap *);
void hmap_destroy(struct hmap *);
+void hmap_clear(struct hmap *);
void hmap_swap(struct hmap *a, struct hmap *b);
void hmap_moved(struct hmap *hmap);
static inline size_t hmap_count(const struct hmap *);