aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Smeding <tom.smeding@gmail.com>2020-08-08 12:06:59 +0200
committerTom Smeding <tom.smeding@gmail.com>2020-08-08 12:06:59 +0200
commitfc18e73c7e66c7a03381312937434aac7210ca6b (patch)
treeb64b9fa1f246efbdbac1356114afb1811a6400c9
parent8f17684810718973c8ea0f1150e46d6c1b8c0ef1 (diff)
server: Fix bug in hashtable
-rw-r--r--hashtable.c13
-rw-r--r--hashtable.h3
2 files changed, 14 insertions, 2 deletions
diff --git a/hashtable.c b/hashtable.c
index 020d281..322e69c 100644
--- a/hashtable.c
+++ b/hashtable.c
@@ -1,4 +1,5 @@
#include <limits.h>
+#include <assert.h>
#include "hashtable.h"
@@ -72,7 +73,7 @@ static void ht_grow(struct hashtable *ht) {
*ht = newht;
}
-struct hashtable* ht_alloc() {
+struct hashtable* ht_alloc(void) {
struct hashtable *ht = malloc(1, struct hashtable);
ht->modulus_index = 0;
ht->modulus = doubling_primes[ht->modulus_index];
@@ -90,8 +91,18 @@ void ht_free(struct hashtable *ht) {
}
void ht_insert(struct hashtable *ht, u64 key, void *value) {
+ assert(value != NULL);
+
struct bucket *bucket = &ht->table[key % ht->modulus];
+ // If key already exists, overwrite that
+ for (int i = 0; i < bucket->len; i++) {
+ if (bucket->pairs[i].key == key) {
+ bucket->pairs[i].value = value;
+ return;
+ }
+ }
+
if (bucket->cap == 0) {
bucket->cap = 1;
bucket->pairs = malloc(bucket->cap, struct keyvalue);
diff --git a/hashtable.h b/hashtable.h
index 21467a8..5147fa5 100644
--- a/hashtable.h
+++ b/hashtable.h
@@ -5,9 +5,10 @@
struct hashtable;
-struct hashtable* ht_alloc();
+struct hashtable* ht_alloc(void);
void ht_free(struct hashtable *ht);
+// Overwrites if the key already exists in the table.
void ht_insert(struct hashtable *ht, u64 key, void *value);
// Returns NULL if key is not present in the table.