From 820fa61ad45099e413acc04674ca645ad758e26b Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Sun, 7 Jun 2015 00:58:36 +0200 Subject: [PATCH hurd 3/3] libihash: prefer performance degradation over failure * libihash/ihash.c (hurd_ihash_add): Add the item even though we are above the load factor if resizing failed. --- libihash/ihash.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/libihash/ihash.c b/libihash/ihash.c index a97de3e..8133e01 100644 --- a/libihash/ihash.c +++ b/libihash/ihash.c @@ -301,18 +301,19 @@ hurd_ihash_add (hurd_ihash_t ht, hurd_ihash_key_t key, hurd_ihash_value_t item) { struct hurd_ihash old_ht = *ht; int was_added; + int fatal = 0; /* bail out on allocation errors */ unsigned int i; if (ht->size) { /* Only fill the hash table up to its maximum load factor. */ if (hurd_ihash_get_load (ht) <= ht->max_load) + add_one: if (add_one (ht, key, item)) return 0; } /* The hash table is too small, and we have to increase it. */ - ht->nr_items = 0; if (ht->size == 0) ht->size = HURD_IHASH_MIN_SIZE; else @@ -324,10 +325,19 @@ hurd_ihash_add (hurd_ihash_t ht, hurd_ihash_key_t key, hurd_ihash_value_t item) if (ht->items == NULL) { *ht = old_ht; - return ENOMEM; + if (fatal || ht->size == 0) + return ENOMEM; + + /* We prefer performance degradation over failure. Therefore, + we add the item even though we are above the load factor. If + the table is full, this will fail. We set the fatal flag to + avoid looping. */ + fatal = 1; + goto add_one; } /* We have to rehash the old entries. */ + ht->nr_items = 0; for (i = 0; i < old_ht.size; i++) if (!index_empty (&old_ht, i)) { -- 2.1.4