- if (new_size > old_size)
- init_table(ht, new_t, old_size, new_size - old_size);
- cmm_smp_wmb(); /* update content before updating reallocated size */
- CMM_STORE_SHARED(new_t->size, new_size);
- if (new_t != old_t) {
- /* Changing table and size atomically wrt lookups */
- rcu_assign_pointer(ht->t, new_t);
- ht->ht_call_rcu(&old_t->head, ht_free_table_cb);
- }
+ assert(new_size > old_size);
+ memcpy(&new_t->tbl, &old_t->tbl,
+ old_size * sizeof(struct rcu_ht_node *));
+ init_table(ht, new_t, old_size, new_size - old_size);
+ new_t->size = new_size;
+ /* Changing table and size atomically wrt lookups */
+ rcu_assign_pointer(ht->t, new_t);
+ ht->ht_call_rcu(&old_t->head, ht_free_table_cb);