diff options
author | Mattias Andrée <maandree@operamail.com> | 2014-04-22 10:19:45 +0200 |
---|---|---|
committer | Mattias Andrée <maandree@operamail.com> | 2014-04-22 10:19:45 +0200 |
commit | 852d01b3e233f9ec713d64cb7c26dc945b78072f (patch) | |
tree | 1a00f44b28f08f9c71fc033348184201398b9063 | |
parent | more restrict (diff) | |
download | mds-852d01b3e233f9ec713d64cb7c26dc945b78072f.tar.gz mds-852d01b3e233f9ec713d64cb7c26dc945b78072f.tar.bz2 mds-852d01b3e233f9ec713d64cb7c26dc945b78072f.tar.xz |
error support
Signed-off-by: Mattias Andrée <maandree@operamail.com>
-rw-r--r-- | src/libmdsserver/hash-table.c | 24 | ||||
-rw-r--r-- | src/libmdsserver/hash-table.h | 3 |
2 files changed, 20 insertions, 7 deletions
diff --git a/src/libmdsserver/hash-table.c b/src/libmdsserver/hash-table.c index 3468811..a02e6a9 100644 --- a/src/libmdsserver/hash-table.c +++ b/src/libmdsserver/hash-table.c @@ -17,6 +17,8 @@ */ #include "hash-table.h" +#include <errno.h> + /** * Test if a key matches the key in a bucket @@ -59,9 +61,10 @@ static inline size_t __attribute__((pure)) truncate_hash(const hash_table_t* res /** * Grow the table * - * @param this The hash table + * @param this The hash table + * @return Non zero on error, errno will be set accordingly */ -static void rehash(hash_table_t* restrict this) +static int rehash(hash_table_t* restrict this) { hash_entry_t** old_buckets = this->buckets; size_t old_capacity = this->capacity; @@ -70,9 +73,11 @@ static void rehash(hash_table_t* restrict this) hash_entry_t* destination; hash_entry_t* next; + this->buckets = calloc((old_capacity * 2 + 1), sizeof(hash_entry_t*)); + if (this->buckets == NULL) + return -1; this->capacity = old_capacity * 2 + 1; this->threshold = (size_t)((float)(this->capacity) * this->load_factor); - this->buckets = calloc(this->capacity, sizeof(hash_entry_t*)); /* TODO: error support */ while (i) { @@ -100,6 +105,7 @@ static void rehash(hash_table_t* restrict this) } free(old_buckets); + return 0; } @@ -247,7 +253,8 @@ size_t hash_table_get(const hash_table_t* restrict this, size_t key) * @param this The hash table * @param key The key of the entry to add * @param value The value of the entry to add - * @return The previous value associated with the key, 0 if the key was not used + * @return The previous value associated with the key, 0 if the key was not used. + * 0 will also be returned on error, check the `errno` variable. */ size_t hash_table_put(hash_table_t* restrict this, size_t key, size_t value) { @@ -268,11 +275,16 @@ size_t hash_table_put(hash_table_t* restrict this, size_t key, size_t value) if (++(this->size) > this->threshold) { - rehash(this); + errno = 0; + if (rehash(this)) + return 0; index = truncate_hash(this, key_hash); } - bucket = malloc(sizeof(hash_entry_t)); /* TODO: error support */ + errno = 0; + bucket = malloc(sizeof(hash_entry_t)); + if (bucket == NULL) + return 0; bucket->value = value; bucket->key = key; bucket->hash = key_hash; diff --git a/src/libmdsserver/hash-table.h b/src/libmdsserver/hash-table.h index f224401..9b05804 100644 --- a/src/libmdsserver/hash-table.h +++ b/src/libmdsserver/hash-table.h @@ -211,7 +211,8 @@ size_t hash_table_get(const hash_table_t* restrict this, size_t key); * @param this The hash table * @param key The key of the entry to add * @param value The value of the entry to add - * @return The previous value associated with the key, 0 if the key was not used + * @return The previous value associated with the key, 0 if the key was not used. + * 0 will also be returned on error, check the `errno` variable. */ size_t hash_table_put(hash_table_t* restrict this, size_t key, size_t value); |