ht_compare_fct compare_fct;
unsigned long hash_seed;
pthread_mutex_t resize_mutex; /* resize mutex: add/del mutex */
- unsigned int in_progress_resize;
+ unsigned int in_progress_resize, in_progress_destroy;
void (*ht_call_rcu)(struct rcu_head *head,
void (*func)(struct rcu_head *head));
};
new_node->p.reverse_hash =
bit_reverse_ulong(!i ? 0 : (1UL << (i - 1)) + j);
(void) _ht_add(ht, t, new_node, 0, 1);
+ if (CMM_LOAD_SHARED(ht->in_progress_destroy))
+ break;
}
/* Update table size */
t->size = !i ? 1 : (1UL << i);
dbg_printf("rculfhash: init new size: %lu\n", t->size);
+ if (CMM_LOAD_SHARED(ht->in_progress_destroy))
+ break;
}
t->resize_target = t->size;
t->resize_initiated = 0;
int ret;
/* Wait for in-flight resize operations to complete */
+ CMM_STORE_SHARED(ht->in_progress_destroy, 1);
while (uatomic_read(&ht->in_progress_resize))
poll(NULL, 0, 100); /* wait for 100ms */
ret = ht_delete_dummy(ht);
#define printf_verbose(fmt, args...) \
do { \
if (verbose_mode) \
- printf(fmt, args); \
+ printf(fmt, ## args); \
} while (0)
static unsigned int cpu_affinities[NR_CPUS];
tot_add += count_writer[i].add;
tot_remove += count_writer[i].remove;
}
+ printf("Counting nodes... ");
+ fflush(stdout);
ht_count_nodes(test_ht, &count, &removed);
+ printf("done.\n");
if (count || removed)
printf("WARNING: nodes left in the hash table upon destroy: "
"%lu nodes + %lu logically removed.\n", count, removed);
- (void) ht_destroy(test_ht);
+ ret = ht_destroy(test_ht);
- printf_verbose("final delete: %d items\n", ret);
+ if (ret)
+ printf_verbose("final delete aborted\n");
+ else
+ printf_verbose("final delete success\n");
printf_verbose("total number of reads : %llu, writes %llu\n", tot_reads,
tot_writes);
printf("SUMMARY %-25s testdur %4lu nr_readers %3u rdur %6lu "