Hi Juergen,

On 10/07/2023 07:59, Juergen Gross wrote:
For an effective way to replace a hashtable entry add a new function
hashtable_replace().

While at it let hashtable_add() fail if an entry with the specified
key does already exist.

This seems to be a left-over from the previous version.


This is in preparation to replace TDB with a more simple data storage.

Signed-off-by: Juergen Gross <jgr...@suse.com>
---
  tools/xenstore/hashtable.c | 20 ++++++++++++++++++++
  tools/xenstore/hashtable.h | 16 ++++++++++++++++
  2 files changed, 36 insertions(+)

diff --git a/tools/xenstore/hashtable.c b/tools/xenstore/hashtable.c
index 29c247f918..0c26a09567 100644
--- a/tools/xenstore/hashtable.c
+++ b/tools/xenstore/hashtable.c
@@ -160,6 +160,7 @@ static struct entry *hashtable_search_entry(const struct 
hashtable *h,
return NULL;
  }
+

I think this belong to the previous patch.

  int hashtable_add(struct hashtable *h, const void *k, void *v)
  {
      unsigned int index;
@@ -204,6 +205,25 @@ void *hashtable_search(const struct hashtable *h, const 
void *k)
      return e ? e->v : NULL;
  }
+int hashtable_replace(struct hashtable *h, const void *k, void *v)
+{
+    struct entry *e;
+
+    e = hashtable_search_entry(h, k);
+    if (!e)
+        return ENOENT;
+
+    if (h->flags & HASHTABLE_FREE_VALUE)
+    {
+        talloc_free(e->v);
+        talloc_steal(e, v);
+    }
+
+    e->v = v;
+
+    return 0;
+}
+
  void
  hashtable_remove(struct hashtable *h, const void *k)
  {
diff --git a/tools/xenstore/hashtable.h b/tools/xenstore/hashtable.h
index 792f6cda7b..214aea1b3d 100644
--- a/tools/xenstore/hashtable.h
+++ b/tools/xenstore/hashtable.h
@@ -51,6 +51,22 @@ create_hashtable(const void *ctx, const char *name,
  int
  hashtable_add(struct hashtable *h, const void *k, void *v);
+/*****************************************************************************
+ * hashtable_replace
+
+ * @name        hashtable_nsert
+ * @param   h   the hashtable to insert into
+ * @param   k   the key - hashtable claims ownership and will free on removal
+ * @param   v   the value - does not claim ownership
+ * @return      zero for successful insertion
+ *
+ * This function does check for an entry being present before replacing it
+ * with a new value.
+ */
+
+int
+hashtable_replace(struct hashtable *h, const void *k, void *v);
+
  /*****************************************************************************
   * hashtable_search

Chees,

--
Julien Grall

Reply via email to