[ltt-dev] [PATCH 5/5] rculfhash: add CDS_LFHT_ACCOUNTING flag

Lai Jiangshan laijs at cn.fujitsu.com
Fri Oct 28 03:48:33 EDT 2011


On 10/28/2011 03:32 PM, Mathieu Desnoyers wrote:
> * Lai Jiangshan (laijs at cn.fujitsu.com) wrote:
>> 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);
> 
> If ht->split_count can be null, we should check for it either here or
> within the #ifdef POISON_FREE  poison_free implementation, else the
> memset will dereference a NULL pointer.
> 

Ouch!

Could you modify it a little.(avoid a simple respin.)

	if (ht->split_count)
		poison_free(ht->split_count);

Thanks,
Lai


> 
>> +	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