X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=rculfhash.c;h=d04451fece7ac744cb0b894b1f2b5e3803b9785f;hb=6e464eba97cf74320fe4e2b8da6dbe5039582948;hp=dd49c500db4aa8fa77b859101b3e021ed6ecb96b;hpb=314558bf8e679784e0c4d5638ffbdfbc72595246;p=urcu.git diff --git a/rculfhash.c b/rculfhash.c index dd49c50..d04451f 100644 --- a/rculfhash.c +++ b/rculfhash.c @@ -242,15 +242,6 @@ struct partition_resize_work { unsigned long start, unsigned long len); }; -static -void _cds_lfht_add(struct cds_lfht *ht, - cds_lfht_match_fct match, - const void *key, - unsigned long size, - struct cds_lfht_node *node, - struct cds_lfht_iter *unique_ret, - int bucket); - /* * Algorithm to reverse bits in a word by lookup table, extended to * 64-bit words. @@ -549,7 +540,7 @@ void ht_count_add(struct cds_lfht *ht, unsigned long size, unsigned long hash) dbg_printf("add split count %lu\n", split_count); count = uatomic_add_return(&ht->count, 1UL << COUNT_COMMIT_ORDER); - if (likely(count & (count - 1))) + if (caa_likely(count & (count - 1))) return; /* Only if global count is power of 2 */ @@ -578,7 +569,7 @@ void ht_count_del(struct cds_lfht *ht, unsigned long size, unsigned long hash) dbg_printf("del split count %lu\n", split_count); count = uatomic_add_return(&ht->count, -(1UL << COUNT_COMMIT_ORDER)); - if (likely(count & (count - 1))) + if (caa_likely(count & (count - 1))) return; /* Only if global count is power of 2 */ @@ -1158,6 +1149,11 @@ void remove_table(struct cds_lfht *ht, unsigned long i, unsigned long len) partition_resize_helper(ht, i, len, remove_table_partition); } +/* + * fini_table() is never called for first_order == 0, which is why + * free_by_rcu_order == 0 can be used as criterion to know if free must + * be called. + */ static void fini_table(struct cds_lfht *ht, unsigned long first_order, unsigned long last_order) @@ -1275,6 +1271,30 @@ struct cds_lfht *_cds_lfht_new(unsigned long init_size, if (!init_size || (init_size & (init_size - 1))) return NULL; + /* + * Memory management plugin default. + */ + if (!mm) { + if (CAA_BITS_PER_LONG > 32 + && max_nr_buckets + && max_nr_buckets <= (1ULL << 32)) { + /* + * For 64-bit architectures, with max number of + * buckets small enough not to use the entire + * 64-bit memory mapping space (and allowing a + * fair number of hash table instances), use the + * mmap allocator, which is faster than the + * order allocator. + */ + mm = &cds_lfht_mm_mmap; + } else { + /* + * The fallback is to use the order allocator. + */ + mm = &cds_lfht_mm_order; + } + } + /* max_nr_buckets == 0 for order based mm means infinite */ if (mm == &cds_lfht_mm_order && !max_nr_buckets) max_nr_buckets = 1UL << (MAX_TABLE_ORDER - 1);