diff options
author | Justus Winter <4winter@informatik.uni-hamburg.de> | 2015-10-30 12:56:35 +0100 |
---|---|---|
committer | Justus Winter <4winter@informatik.uni-hamburg.de> | 2015-10-30 12:56:35 +0100 |
commit | ed5751155a85a3913e4aee2f8e050751740fc8b6 (patch) | |
tree | 39c59c059c8e8f9ff9f3720135f1343c2810ea80 /debian/patches/ihash-as-cache0003-libihash-prefer-performance-degradation-over-failure.patch | |
parent | 9c582abd66cdef750ae6ae0c306e9ce7b50a520a (diff) |
add patch series
Diffstat (limited to 'debian/patches/ihash-as-cache0003-libihash-prefer-performance-degradation-over-failure.patch')
-rw-r--r-- | debian/patches/ihash-as-cache0003-libihash-prefer-performance-degradation-over-failure.patch | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/debian/patches/ihash-as-cache0003-libihash-prefer-performance-degradation-over-failure.patch b/debian/patches/ihash-as-cache0003-libihash-prefer-performance-degradation-over-failure.patch new file mode 100644 index 00000000..d5f73b75 --- /dev/null +++ b/debian/patches/ihash-as-cache0003-libihash-prefer-performance-degradation-over-failure.patch @@ -0,0 +1,65 @@ +From dbff902c41d3e87f2a0491272d5aca80aef29224 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 | 18 +++++++++++++++--- + 1 file changed, 15 insertions(+), 3 deletions(-) + +diff --git a/libihash/ihash.c b/libihash/ihash.c +index a97de3e..c273834 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 +@@ -323,11 +324,22 @@ 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 || old_ht.size == 0) ++ { ++ *ht = old_ht; ++ 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 + |