}
#ifdef POISON_FREE
-#define poison_free(ptr) \
- do { \
- memset(ptr, 0x42, sizeof(*(ptr))); \
- free(ptr); \
+#define poison_free(ptr) \
+ do { \
+ if (ptr) { \
+ memset(ptr, 0x42, sizeof(*(ptr))); \
+ free(ptr); \
+ } \
} while (0)
#else
#define poison_free(ptr) free(ptr)
#endif /* #else #if defined(HAVE_SYSCONF) */
static
-struct ht_items_count *alloc_split_items_count(void)
+void alloc_split_items_count(struct cds_lfht *ht)
{
struct ht_items_count *count;
}
assert(split_count_mask >= 0);
- return calloc(split_count_mask + 1, sizeof(*count));
+
+ if (ht->flags & CDS_LFHT_ACCOUNTING) {
+ ht->split_count = calloc(split_count_mask + 1, sizeof(*count));
+ assert(ht->split_count);
+ } else {
+ ht->split_count = NULL;
+ }
}
static
-void free_split_items_count(struct ht_items_count *count)
+void free_split_items_count(struct cds_lfht *ht)
{
- poison_free(count);
+ poison_free(ht->split_count);
}
#if defined(HAVE_SCHED_GETCPU)
init_size = max(init_size, min_alloc_size);
ht = calloc(1, sizeof(struct cds_lfht));
assert(ht);
+ ht->flags = flags;
ht->hash_fct = hash_fct;
ht->compare_fct = compare_fct;
ht->hash_seed = hash_seed;
ht->cds_lfht_rcu_register_thread = cds_lfht_rcu_register_thread;
ht->cds_lfht_rcu_unregister_thread = cds_lfht_rcu_unregister_thread;
ht->resize_attr = attr;
- ht->split_count = alloc_split_items_count();
+ alloc_split_items_count(ht);
/* this mutex should not nest in read-side C.S. */
pthread_mutex_init(&ht->resize_mutex, NULL);
- ht->flags = flags;
order = get_count_order_ulong(init_size);
ht->t.resize_target = 1UL << order;
cds_lfht_create_dummy(ht, 1UL << order);
ret = cds_lfht_delete_dummy(ht);
if (ret)
return ret;
- free_split_items_count(ht->split_count);
+ free_split_items_count(ht);
if (attr)
*attr = ht->resize_attr;
poison_free(ht);
unsigned long nr_dummy = 0;
*approx_before = 0;
- if (split_count_mask >= 0) {
+ if (ht->split_count) {
int i;
for (i = 0; i < split_count_mask + 1; i++) {
} while (!is_end(node));
dbg_printf("number of dummy nodes: %lu\n", nr_dummy);
*approx_after = 0;
- if (split_count_mask >= 0) {
+ if (ht->split_count) {
int i;
for (i = 0; i < split_count_mask + 1; i++) {