- unsigned long i, new_size, old_size;
- struct rcu_table *new_t, *old_t;
- struct rcu_ht_node *node, *new_node, *tmp;
- unsigned long hash;
-
- old_t = ht->t;
- old_size = old_t->size;
-
- if (old_size == MAX_HT_BUCKETS)
- return;
-
- 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++) {
- /*
- * Re-hash each entry, insert in new table.
- * It's important that a reader looking for a key _will_ find it
- * if it's in the table.
- * Copy each node. (just the node, not ->data)
- */
- node = old_t->tbl[i];
- while (node) {
- hash = ht->hash_fct(node->key, ht->keylen, ht->hashseed)
- % new_size;
- new_node = malloc(sizeof(struct rcu_ht_node));
- new_node->key = node->key;
- new_node->data = node->data;
- 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;
- }
- }