rculfhash: Add clear flag
[urcu.git] / rculfhash.c
index 3120d4585995c030a999903b0667d803ebf5b877..da04b9dce7ced2659a0b89ee6fd806d3dc97c439 100644 (file)
@@ -53,6 +53,9 @@
 #define max(a, b)      ((a) > (b) ? (a) : (b))
 #endif
 
+#define REMOVED_FLAG           (1UL << 0)
+#define FLAGS_MASK             ((1UL << 1) - 1)
+
 struct rcu_table {
        unsigned long size;     /* always a power of 2 */
        unsigned long resize_target;
@@ -176,19 +179,19 @@ void check_resize(struct rcu_ht *ht, struct rcu_table *t,
 static
 struct rcu_ht_node *clear_flag(struct rcu_ht_node *node)
 {
-       return (struct rcu_ht_node *) (((unsigned long) node) & ~0x1);
+       return (struct rcu_ht_node *) (((unsigned long) node) & ~FLAGS_MASK);
 }
 
 static
 int is_removed(struct rcu_ht_node *node)
 {
-       return ((unsigned long) node) & 0x1;
+       return ((unsigned long) node) & REMOVED_FLAG;
 }
 
 static
 struct rcu_ht_node *flag_removed(struct rcu_ht_node *node)
 {
-       return (struct rcu_ht_node *) (((unsigned long) node) | 0x1);
+       return (struct rcu_ht_node *) (((unsigned long) node) | REMOVED_FLAG);
 }
 
 static
@@ -219,7 +222,7 @@ void _ht_gc_bucket(struct rcu_ht_node *dummy, struct rcu_ht_node *node)
                iter = rcu_dereference(iter_prev->p.next);
                assert(iter_prev->p.reverse_hash <= node->p.reverse_hash);
                for (;;) {
-                       if (unlikely(!iter))
+                       if (unlikely(!clear_flag(iter)))
                                return;
                        if (clear_flag(iter)->p.reverse_hash > node->p.reverse_hash)
                                return;
@@ -258,7 +261,7 @@ struct rcu_ht_node *_ht_add(struct rcu_ht *ht, struct rcu_table *t,
                iter = rcu_dereference(iter_prev->p.next);
                assert(iter_prev->p.reverse_hash <= node->p.reverse_hash);
                for (;;) {
-                       if (unlikely(!iter))
+                       if (unlikely(!clear_flag(iter)))
                                goto insert;
                        if (clear_flag(iter)->p.reverse_hash > node->p.reverse_hash)
                                goto insert;
@@ -462,7 +465,7 @@ int ht_delete_dummy(struct rcu_ht *ht)
                        return -EPERM;
                node = node->p.next;
                assert(!is_removed(node));
-       } while (node);
+       } while (clear_flag(node));
        /* Internal sanity check: all nodes left should be dummy */
        for (i = 0; i < t->size; i++) {
                assert(t->tbl[i]->p.dummy);
This page took 0.023606 seconds and 4 git commands to generate.