aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Barach <dave@barachs.net>2019-07-08 14:47:44 -0400
committerFlorin Coras <florin.coras@gmail.com>2019-07-11 18:04:20 +0000
commit9e4946b324a8480b35c861e96199881b314ea825 (patch)
tree262de11d4b5d913098d5c58ef99573d339b4e0e0
parent39040a619af4e8750349edba2e93eecb8ce4538b (diff)
vppinfra: bihash add-but-do-not-overwrite semantics
If is_add=2, fail w/ return value -2 if the key exists instead of overwriting the (key,value) pair. Type: feature Change-Id: I00a3c194a381c68090369c31d6c6f9870cfe0a62 Signed-off-by: Dave Barach <dave@barachs.net>
-rw-r--r--src/vppinfra/bihash_template.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/vppinfra/bihash_template.c b/src/vppinfra/bihash_template.c
index bf6be83b2e0..cd75a7a9be9 100644
--- a/src/vppinfra/bihash_template.c
+++ b/src/vppinfra/bihash_template.c
@@ -519,6 +519,13 @@ static inline int BV (clib_bihash_add_del_inline)
{
if (BV (clib_bihash_key_compare) (v->kvp[i].key, add_v->key))
{
+ /* Add but do not overwrite? */
+ if (is_add == 2)
+ {
+ BV (clib_bihash_unlock_bucket) (b);
+ return (-2);
+ }
+
CLIB_MEMORY_BARRIER (); /* Add a delay */
clib_memcpy_fast (&(v->kvp[i]), add_v, sizeof (*add_v));
BV (clib_bihash_unlock_bucket) (b);