|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v2 09/18] tools/xenstore: let hashtable_add() fail in case of existing entry
Silently adding another entry with the same key to a hashtable is a
perfect receipt for later failure with hard to diagnose symptoms.
Let hashtable_add() fail in case another entry with the same key is
already existing.
Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
V2:
- split off from next patch (Julien Grall)
- fix coding style (Julien Grall)
- use for () loop (Julien Grall)
---
tools/xenstore/hashtable.c | 39 ++++++++++++++++++++++++++------------
1 file changed, 27 insertions(+), 12 deletions(-)
diff --git a/tools/xenstore/hashtable.c b/tools/xenstore/hashtable.c
index 9daddd9782..29c247f918 100644
--- a/tools/xenstore/hashtable.c
+++ b/tools/xenstore/hashtable.c
@@ -141,11 +141,33 @@ static int hashtable_expand(struct hashtable *h)
return 0;
}
+static struct entry *hashtable_search_entry(const struct hashtable *h,
+ const void *k)
+{
+ struct entry *e;
+ unsigned int hashvalue, index;
+
+ hashvalue = hash(h, k);
+ index = indexFor(h->tablelength, hashvalue);
+ e = h->table[index];
+
+ for (e = h->table[index]; e; e = e->next)
+ {
+ /* Check hash value to short circuit heavier comparison */
+ if ((hashvalue == e->h) && (h->eqfn(k, e->k)))
+ return e;
+ }
+
+ return NULL;
+}
int hashtable_add(struct hashtable *h, const void *k, void *v)
{
- /* This method allows duplicate keys - but they shouldn't be used */
unsigned int index;
struct entry *e;
+
+ if (hashtable_search_entry(h, k))
+ return EEXIST;
+
if (++(h->entrycount) > h->loadlimit)
{
/* Ignore the return value. If expand fails, we should
@@ -176,17 +198,10 @@ int hashtable_add(struct hashtable *h, const void *k,
void *v)
void *hashtable_search(const struct hashtable *h, const void *k)
{
struct entry *e;
- unsigned int hashvalue, index;
- hashvalue = hash(h,k);
- index = indexFor(h->tablelength,hashvalue);
- e = h->table[index];
- while (NULL != e)
- {
- /* Check hash value to short circuit heavier comparison */
- if ((hashvalue == e->h) && (h->eqfn(k, e->k))) return e->v;
- e = e->next;
- }
- return NULL;
+
+ e = hashtable_search_entry(h, k);
+
+ return e ? e->v : NULL;
}
void
--
2.35.3
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |