* Lai Jiangshan ([email protected]) wrote:
> On 10/28/2011 03:32 PM, Mathieu Desnoyers wrote:
> > * Lai Jiangshan ([email protected]) wrote:
> >> Signed-off-by: Lai Jiangshan <[email protected]>
> >> ---
> >>  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);

Will put the test within poison_free instead. Thanks!

Mathieu

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

-- 
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com

_______________________________________________
ltt-dev mailing list
[email protected]
http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev

Reply via email to