unsigned int nr_readers;
unsigned int nr_writers;
-static unsigned int add_ratio = 50;
+static unsigned int add_ratio = 50, range_max_len = 0;
static uint64_t key_mul = 1ULL;
static int add_unique, add_replace;
printf(" [-B] Key bits for multithread test (default: 32).\n");
printf(" [-m factor] Key multiplication factor.\n");
printf(" [-l] Memory leak detection.\n");
+ printf(" [-L len] Range max len.\n");
printf("\n\n");
}
start = end;
end = tmp;
}
+ if (end - start > range_max_len) {
+ end = start + range_max_len;
+ }
rcu_read_lock();
- range = cds_ja_range_add(test_ja, start, end, NULL);
- if (!range) {
- fprintf(stderr, "Error in cds_ja_add: %d\n", ret);
+ ret = cds_ja_range_add(test_ja, start, end, NULL);
+ if (ret) {
+ if (ret == -EEXIST) {
+ URCU_TLS(nr_addexist)++;
+ } else {
+ assert(0);
+ }
} else {
URCU_TLS(nr_add)++;
}
key = (unsigned long) iter;
key *= key_mul;
rcu_read_lock();
- range = cds_ja_range_add(test_ja, key, key, NULL);
+ ret = cds_ja_range_add(test_ja, key, key, NULL);
URCU_TLS(nr_add)++;
URCU_TLS(nr_writes)++;
rcu_read_unlock();
- if (!range) {
- fprintf(stderr, "Error adding range %" PRIu64 "\n",
- key);
+ /* Hash table resize only occurs in call_rcu thread */
+ if (!(iter % 100))
+ rcu_quiescent_state();
+ if (ret) {
+ fprintf(stderr, "Error (%d) adding range %" PRIu64 "\n",
+ ret, key);
assert(0);
}
}
count_reader = malloc(sizeof(*count_reader) * nr_readers);
count_writer = malloc(sizeof(*count_writer) * nr_writers);
- printf("Allocating Judy Array for ranges\n");
- test_ja = cds_ja_range_new();
+ printf("Allocating %u-bit Judy Array for ranges\n",
+ key_bits);
+ test_ja = cds_ja_range_new(key_bits);
if (!test_ja) {
printf("Error allocating judy array.\n");
ret = -1;
}
rcu_thread_online_qsbr();
+ ret = cds_ja_range_validate(test_ja);
+ assert(!ret);
+
ret = cds_ja_range_destroy(test_ja, NULL);
if (ret) {
fprintf(stderr, "Error destroying judy array\n");
case 'l':
leak_detection = 1;
break;
+ case 'L':
+ range_max_len = atol(argv[++i]);
+ break;
}
}
lookup_pool_offset, lookup_pool_size);
printf_verbose("Update pool size offset %lu size %lu.\n",
write_pool_offset, write_pool_size);
+ printf_verbose("Range max len: %lu.\n",
+ range_max_len);
if (validate_lookup)
printf_verbose("Validating lookups.\n");
if (leak_detection)