cpu = ht_get_cpu();
if (unlikely(cpu < 0))
return;
- percpu_count = uatomic_add_return(&ht->percpu_count[cpu].del, -1);
+ percpu_count = uatomic_add_return(&ht->percpu_count[cpu].del, 1);
if (unlikely(!(percpu_count & ((1UL << COUNT_COMMIT_ORDER) - 1)))) {
unsigned long count;
}
void cds_lfht_count_nodes(struct cds_lfht *ht,
+ unsigned long *approx_before,
unsigned long *count,
- unsigned long *removed)
+ unsigned long *removed,
+ unsigned long *approx_after)
{
struct cds_lfht_node *node, *next;
struct _cds_lfht_node *lookup;
unsigned long nr_dummy = 0;
+ *approx_before = 0;
+ if (nr_cpus_mask >= 0) {
+ int i;
+
+ for (i = 0; i < nr_cpus_mask + 1; i++) {
+ *approx_before += uatomic_read(&ht->percpu_count[i].add);
+ *approx_before -= uatomic_read(&ht->percpu_count[i].del);
+ }
+ }
+
*count = 0;
*removed = 0;
do {
next = rcu_dereference(node->p.next);
if (is_removed(next)) {
- assert(!is_dummy(next));
- (*removed)++;
+ if (!is_dummy(next))
+ (*removed)++;
+ else
+ (nr_dummy)++;
} else if (!is_dummy(next))
(*count)++;
else
node = clear_flag(next);
} while (!is_end(node));
dbg_printf("number of dummy nodes: %lu\n", nr_dummy);
+ *approx_after = 0;
+ if (nr_cpus_mask >= 0) {
+ int i;
+
+ for (i = 0; i < nr_cpus_mask + 1; i++) {
+ *approx_after += uatomic_read(&ht->percpu_count[i].add);
+ *approx_after -= uatomic_read(&ht->percpu_count[i].del);
+ }
+ }
}
/* called with resize mutex held */