Make a function only do one thing.

Signed-off-by: Lai Jiangshan <[email protected]>
---
 rculfhash.c |   38 ++++++++++++++------------------------
 1 files changed, 14 insertions(+), 24 deletions(-)

diff --git a/rculfhash.c b/rculfhash.c
index 8433ec4..f412c6f 100644
--- a/rculfhash.c
+++ b/rculfhash.c
@@ -264,7 +264,6 @@ struct partition_resize_work {
 enum add_mode {
        ADD_DEFAULT = 0,
        ADD_UNIQUE = 1,
-       ADD_REPLACE = 2,
 };
 
 static
@@ -883,16 +882,13 @@ struct cds_lfht_node *_cds_lfht_add(struct cds_lfht *ht,
                        next = rcu_dereference(clear_flag(iter)->p.next);
                        if (unlikely(is_removed(next)))
                                goto gc_node;
-                       if ((mode == ADD_UNIQUE || mode == ADD_REPLACE)
+                       if ((mode == ADD_UNIQUE)
                            && !is_dummy(next)
                            && clear_flag(iter)->p.reverse_hash == 
node->p.reverse_hash
                            && !ht->compare_fct(node->key, node->key_len,
                                                clear_flag(iter)->key,
                                                clear_flag(iter)->key_len)) {
-                               if (mode == ADD_UNIQUE)
-                                       return clear_flag(iter);
-                               else /* mode == ADD_REPLACE */
-                                       goto replace;
+                               return clear_flag(iter);
                        }
                        /* Only account for identical reverse hash once */
                        if (iter_prev->p.reverse_hash != 
clear_flag(iter)->p.reverse_hash
@@ -919,23 +915,10 @@ struct cds_lfht_node *_cds_lfht_add(struct cds_lfht *ht,
                                    new_node) != iter) {
                        continue;       /* retry */
                } else {
-                       if (mode == ADD_REPLACE)
-                               return_node = NULL;
-                       else    /* ADD_DEFAULT and ADD_UNIQUE */
-                               return_node = node;
+                       return_node = node;
                        goto end;
                }
 
-       replace:
-
-               if (!_cds_lfht_replace(ht, size, clear_flag(iter), next,
-                                   node)) {
-                       return_node = clear_flag(iter);
-                       goto end;       /* gc already done */
-               } else {
-                       continue;       /* retry */
-               }
-
        gc_node:
                assert(!is_removed(iter));
                if (is_dummy(iter))
@@ -1455,10 +1438,17 @@ struct cds_lfht_node *cds_lfht_add_replace(struct 
cds_lfht *ht,
        node->p.reverse_hash = bit_reverse_ulong((unsigned long) hash);
 
        size = rcu_dereference(ht->t.size);
-       ret = _cds_lfht_add(ht, size, node, ADD_REPLACE, 0);
-       if (ret == NULL)
-               ht_count_add(ht, size);
-       return ret;
+       for (;;) {
+               ret = _cds_lfht_add(ht, size, node, ADD_UNIQUE, 0);
+               if (ret == node) {
+                       ht_count_add(ht, size);
+                       return NULL;
+               }
+
+               if (!_cds_lfht_replace(ht, size, ret,
+                               rcu_dereference(ret->p.next), node))
+                       return ret;
+       }
 }
 
 int cds_lfht_replace(struct cds_lfht *ht, struct cds_lfht_iter *old_iter,
-- 
1.7.4.4


_______________________________________________
ltt-dev mailing list
[email protected]
http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev

Reply via email to