printf(" [-a cpu#] [-a cpu#]... (affinity)\n");
printf(" [not -u nor -s] Add entries (supports redundant keys).\n");
printf(" [-r ratio] Add ratio (in %% of add+removal).\n");
- printf(" [-k nr_nodes] Number of nodes to insert initially.\n");
+ printf(" [-k] Populate init nodes.\n");
printf(" [-R offset] Lookup pool offset.\n");
printf(" [-S offset] Write pool offset.\n");
printf(" [-T offset] Init pool offset.\n");
if ((addremove == AR_ADD)
|| (addremove == AR_RANDOM && is_add())) {
struct ja_test_node *node = malloc(sizeof(*node));
+ struct cds_ja_node *ret_node;
/* note: only inserting ulong keys */
key = ((unsigned long) rand_r(&URCU_TLS(rand_lookup)) % write_pool_size) + write_pool_offset;
key *= key_mul;
ja_test_node_init(node, key);
rcu_read_lock();
- ret = cds_ja_add(test_ja, key, &node->node);
- URCU_TLS(nr_add)++;
+ ret_node = cds_ja_add_unique(test_ja, key, &node->node);
rcu_read_unlock();
- if (ret) {
- fprintf(stderr, "Error (%d) adding node %" PRIu64 "\n",
- ret, key);
- assert(0);
+ if (ret_node != &node->node) {
+ free(node);
+ URCU_TLS(nr_addexist)++;
+ } else {
+ URCU_TLS(nr_add)++;
}
} else {
struct ja_test_node *node;
tot_add_exist += count_writer[i].add_exist;
tot_remove += count_writer[i].remove;
}
+ rcu_thread_online_qsbr();
ret = cds_ja_destroy(test_ja, free_node_cb);
if (ret) {
fprintf(stderr, "Error destroying judy array\n");
goto end;
}
- rcu_thread_online_qsbr();
free(tid_reader);
free(tid_writer);
add_ratio = atoi(argv[++i]);
break;
case 'k':
- init_populate = atol(argv[++i]);
+ init_populate = 1;
break;
case 'R':
lookup_pool_offset = atol(argv[++i]);