[dpdk-dev] hash: add rte_hash_set_cmp_func() function.

Message ID 1447396093-29004-1-git-send-email-kamasamikon@qq.com (mailing list archive)
State Changes Requested, archived
Headers

Commit Message

kamasamikon Nov. 13, 2015, 6:28 a.m. UTC
  Give user a chance to costomize the hash key compare function.
The default rte_hash_cmp_eq function is set in the rte_hash_create
function, but these builtin ones may not good enough, so the user
may call this to override the default one.

Signed-off-by: Yu Nemo Wenbin <yuwb_bjy@ctbri.com.cn>
---
 lib/librte_hash/rte_cuckoo_hash.c |  7 +++++--
 lib/librte_hash/rte_hash.h        | 12 ++++++++++++
 2 files changed, 17 insertions(+), 2 deletions(-)
  

Comments

Bruce Richardson Nov. 13, 2015, 10 a.m. UTC | #1
On Fri, Nov 13, 2015 at 02:28:13PM +0800, kamasamikon wrote:
> Give user a chance to costomize the hash key compare function.
> The default rte_hash_cmp_eq function is set in the rte_hash_create
> function, but these builtin ones may not good enough, so the user
> may call this to override the default one.
> 
> Signed-off-by: Yu Nemo Wenbin <yuwb_bjy@ctbri.com.cn>
> ---
Hi,

Just a few small comments:

When adding a new function, you'll need to update the map file for the library
with the new API so it can be correctly versionned.

Also, using function pointers does not work with DPDK multi-process, so, at 
minimum, you need to add to the doxygen documentation that your new function cannot
be used in multi-process mode.

/Bruce
  

Patch

diff --git a/lib/librte_hash/rte_cuckoo_hash.c b/lib/librte_hash/rte_cuckoo_hash.c
index 1e970de..71e2419 100644
--- a/lib/librte_hash/rte_cuckoo_hash.c
+++ b/lib/librte_hash/rte_cuckoo_hash.c
@@ -98,8 +98,6 @@  EAL_REGISTER_TAILQ(rte_hash_tailq)
 
 #define LCORE_CACHE_SIZE		8
 
-typedef int (*rte_hash_cmp_eq_t)(const void *key1, const void *key2, size_t key_len);
-
 struct lcore_cache {
 	unsigned len; /**< Cache len */
 	void *objs[LCORE_CACHE_SIZE]; /**< Cache objects */
@@ -183,6 +181,11 @@  rte_hash_find_existing(const char *name)
 	return h;
 }
 
+void rte_hash_set_cmp_func(struct rte_hash *h, rte_hash_cmp_eq_t func)
+{
+    h->rte_hash_cmp_eq = func;
+}
+
 struct rte_hash *
 rte_hash_create(const struct rte_hash_parameters *params)
 {
diff --git a/lib/librte_hash/rte_hash.h b/lib/librte_hash/rte_hash.h
index b678766..d626d1c 100644
--- a/lib/librte_hash/rte_hash.h
+++ b/lib/librte_hash/rte_hash.h
@@ -66,6 +66,9 @@  typedef uint32_t hash_sig_t;
 typedef uint32_t (*rte_hash_function)(const void *key, uint32_t key_len,
 				      uint32_t init_val);
 
+/** Type of function used to compare the key. It works like the memcmp() */
+typedef int (*rte_hash_cmp_eq_t)(const void *key1, const void *key2, size_t key_len);
+
 /**
  * Parameters used when creating the hash table.
  */
@@ -104,6 +107,15 @@  struct rte_hash *
 rte_hash_create(const struct rte_hash_parameters *params);
 
 /**
+ * Set the rte_hash_set_cmp_func.
+ * Set the new hash compare function if the default one is not suitable enough.
+ *
+ * @param h
+ *   Hash table to reset
+ */
+void rte_hash_set_cmp_func(struct rte_hash *h, rte_hash_cmp_eq_t func);
+
+/**
  * Find an existing hash table object and return a pointer to it.
  *
  * @param name