projects
/
urcu.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
rculfhash: Add clear flag
[urcu.git]
/
rculfhash.c
diff --git
a/rculfhash.c
b/rculfhash.c
index 3120d4585995c030a999903b0667d803ebf5b877..da04b9dce7ced2659a0b89ee6fd806d3dc97c439 100644
(file)
--- a/
rculfhash.c
+++ b/
rculfhash.c
@@
-53,6
+53,9
@@
#define max(a, b) ((a) > (b) ? (a) : (b))
#endif
#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;
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)
{
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)
{
}
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)
{
}
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
}
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 (;;) {
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;
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 (;;) {
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;
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));
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);
/* 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.025531 seconds
and
4
git commands to generate.