From: Mathieu Desnoyers Date: Wed, 30 Sep 2009 23:51:43 +0000 (-0400) Subject: urcu-ht: fix missing node element in copy X-Git-Tag: v0.7.0~43^2~236 X-Git-Url: https://git.liburcu.org/?p=urcu.git;a=commitdiff_plain;h=1e52eccf3cb657dccb197132f7cb47b683902538;ds=sidebyside urcu-ht: fix missing node element in copy Signed-off-by: Mathieu Desnoyers --- diff --git a/urcu-ht.c b/urcu-ht.c index 9521c06..b8777ac 100644 --- a/urcu-ht.c +++ b/urcu-ht.c @@ -372,6 +372,7 @@ static void ht_resize_grow(struct rcu_ht *ht) new_size = old_size << 1; new_t = calloc(1, sizeof(struct rcu_table) + (new_size * sizeof(struct rcu_ht_node *))); + new_t->size = new_size; for (i = 0; i < old_size; i++) { /* @@ -387,14 +388,15 @@ static void ht_resize_grow(struct rcu_ht *ht) new_node = malloc(sizeof(struct rcu_ht_node)); new_node->key = node->key; new_node->data = node->data; - new_node->next = new_t->tbl[hash]; /* add to head */ - new_t->tbl[hash] = new_node; + new_node->flags = node->flags; + new_node->next = new_t->tbl[hash]; /* link to first */ + new_t->tbl[hash] = new_node; /* add to head */ node = node->next; } } - smp_wmb(); /* write links before changing table */ - ht->t = new_t; /* Changing table and size atomically wrt lookups */ + /* Changing table and size atomically wrt lookups */ + rcu_assign_pointer(ht->t, new_t); /* Ensure all concurrent lookups use new size and table */ synchronize_rcu();