[ltt-dev] [PATCH 5/5] rculfhash: add CDS_LFHT_ACCOUNTING flag
Lai Jiangshan
laijs at cn.fujitsu.com
Thu Oct 27 23:57:28 EDT 2011
Signed-off-by: Lai Jiangshan <laijs at cn.fujitsu.com>
---
rculfhash.c | 22 ++++++++++++++--------
tests/test_urcu_hash.c | 3 ++-
urcu/rculfhash.h | 1 +
3 files changed, 17 insertions(+), 9 deletions(-)
diff --git a/rculfhash.c b/rculfhash.c
index c0c452c..411cb34 100644
--- a/rculfhash.c
+++ b/rculfhash.c
@@ -533,7 +533,7 @@ static void ht_init_nr_cpus_mask(void)
#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;
@@ -546,13 +546,19 @@ struct ht_items_count *alloc_split_items_count(void)
}
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)
@@ -1345,7 +1351,7 @@ struct cds_lfht *_cds_lfht_new(cds_lfht_hash_fct hash_fct,
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;
@@ -1599,7 +1605,7 @@ int cds_lfht_destroy(struct cds_lfht *ht, pthread_attr_t **attr)
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);
@@ -1617,7 +1623,7 @@ void cds_lfht_count_nodes(struct cds_lfht *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++) {
@@ -1647,7 +1653,7 @@ void cds_lfht_count_nodes(struct cds_lfht *ht,
} 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++) {
diff --git a/tests/test_urcu_hash.c b/tests/test_urcu_hash.c
index 70db8b3..9ae1fa0 100644
--- a/tests/test_urcu_hash.c
+++ b/tests/test_urcu_hash.c
@@ -889,7 +889,8 @@ int main(int argc, char **argv)
rcu_register_thread();
test_ht = cds_lfht_new(test_hash, test_compare, 0x42UL,
init_hash_size, 1,
- opt_auto_resize ? CDS_LFHT_AUTO_RESIZE : 0, NULL);
+ (opt_auto_resize ? CDS_LFHT_AUTO_RESIZE : 0) |
+ CDS_LFHT_ACCOUNTING, NULL);
ret = populate_hash();
assert(!ret);
diff --git a/urcu/rculfhash.h b/urcu/rculfhash.h
index fd67b6b..9b96104 100644
--- a/urcu/rculfhash.h
+++ b/urcu/rculfhash.h
@@ -94,6 +94,7 @@ void cds_lfht_node_init(struct cds_lfht_node *node, void *key,
*/
enum {
CDS_LFHT_AUTO_RESIZE = (1U << 0),
+ CDS_LFHT_ACCOUNTING = (1U << 1),
};
/*
--
1.7.4.4
More information about the lttng-dev
mailing list