printf("\n\n");
}
+static
+int test_free_all_nodes(struct cds_ja *ja)
+{
+ uint64_t key;
+ struct cds_ja_node *ja_node;
+ int ret = 0;
+
+ rcu_read_lock();
+ cds_ja_for_each_key_rcu(test_ja, key, ja_node) {
+ struct cds_ja_node *tmp_node;
+
+ cds_ja_for_each_duplicate_safe_rcu(ja_node, tmp_node) {
+ ret = cds_ja_del(test_ja, key, ja_node);
+ if (ret) {
+ fprintf(stderr, "Error (%d) removing node %" PRIu64 "\n", ret, key);
+ goto end;
+ }
+ /* Alone using Judy array, OK to free now */
+ free_node(ja_node);
+ }
+ }
+end:
+ rcu_read_unlock();
+ return ret;
+}
+
static
int test_8bit_key(void)
{
uint64_t key;
uint64_t ka[] = { 5, 17, 100, 222 };
uint64_t ka_test_offset = 5;
+ struct cds_ja_node *ja_node;
/* Test with 8-bit key */
test_ja = cds_ja_new(8);
printf("Test #2: successful key lookup (8-bit).\n");
for (key = 0; key < 200; key++) {
- struct cds_ja_node *node;
-
rcu_read_lock();
- node = cds_ja_lookup(test_ja, key);
- if (!node) {
+ ja_node = cds_ja_lookup(test_ja, key);
+ if (!ja_node) {
fprintf(stderr, "Error lookup node %" PRIu64 "\n", key);
assert(0);
}
printf("OK\n");
printf("Test #3: unsuccessful key lookup (8-bit).\n");
for (key = 200; key < 240; key++) {
- struct cds_ja_node *node;
-
rcu_read_lock();
- node = cds_ja_lookup(test_ja, key);
- if (node) {
+ ja_node = cds_ja_lookup(test_ja, key);
+ if (ja_node) {
fprintf(stderr,
"Error unexpected lookup node %" PRIu64 "\n",
key);
printf("OK\n");
printf("Test #4: remove keys (8-bit).\n");
for (key = 0; key < 200; key++) {
- struct cds_ja_node *ja_node;
struct ja_test_node *node;
rcu_read_lock();
}
for (i = 0; i < CAA_ARRAY_SIZE(ka); i++) {
- struct cds_ja_node *ja_node;
struct ja_test_node *node;
+ uint64_t result_key;
key = ka[i] + ka_test_offset;
rcu_read_lock();
- ja_node = cds_ja_lookup_below_equal(test_ja, key);
+ ja_node = cds_ja_lookup_below_equal(test_ja, key, &result_key);
if (!ja_node) {
fprintf(stderr, "Error lookup below equal. Cannot find expected key %" PRIu64" below or equal to %" PRIu64 ".\n",
ka[i], key);
assert(0);
}
node = caa_container_of(ja_node, struct ja_test_node, node);
- if (node->key != ka[i]) {
- fprintf(stderr, "Error lookup below equal. Expecting key %" PRIu64 " below or equal to %" PRIu64 ", but found %" PRIu64 " instead.\n",
- ka[i], key, node->key);
+ if (node->key != ka[i] || result_key != ka[i]) {
+ fprintf(stderr, "Error lookup below equal. Expecting key %" PRIu64 " below or equal to %" PRIu64 ", but found %" PRIu64 "/%" PRIu64" instead.\n",
+ ka[i], key, node->key, result_key);
assert(0);
}
rcu_read_unlock();
}
for (i = 0; i < CAA_ARRAY_SIZE(ka); i++) {
- struct cds_ja_node *ja_node;
struct ja_test_node *node;
+ uint64_t result_key;
key = ka[i] - ka_test_offset;
rcu_read_lock();
- ja_node = cds_ja_lookup_above_equal(test_ja, key);
+ ja_node = cds_ja_lookup_above_equal(test_ja, key, &result_key);
if (!ja_node) {
fprintf(stderr, "Error lookup above equal. Cannot find expected key %" PRIu64" below or equal to %" PRIu64 ".\n",
ka[i], key);
assert(0);
}
node = caa_container_of(ja_node, struct ja_test_node, node);
- if (node->key != ka[i]) {
- fprintf(stderr, "Error lookup above equal. Expecting key %" PRIu64 " below or equal to %" PRIu64 ", but found %" PRIu64 " instead.\n",
- ka[i], key, node->key);
+ if (node->key != ka[i] || result_key != ka[i]) {
+ fprintf(stderr, "Error lookup above equal. Expecting key %" PRIu64 " below or equal to %" PRIu64 ", but found %" PRIu64 "/%" PRIu64" instead.\n",
+ ka[i], key, node->key, result_key);
assert(0);
}
rcu_read_unlock();
}
for (i = 0; i < CAA_ARRAY_SIZE(ka); i++) {
- struct cds_ja_node *ja_node;
struct ja_test_node *node;
+ uint64_t result_key;
key = ka[i]; /* without offset */
rcu_read_lock();
- ja_node = cds_ja_lookup_below_equal(test_ja, key);
+ ja_node = cds_ja_lookup_below_equal(test_ja, key, &result_key);
if (!ja_node) {
fprintf(stderr, "Error lookup below equal. Cannot find expected key %" PRIu64" below or equal to %" PRIu64 ".\n",
ka[i], key);
assert(0);
}
node = caa_container_of(ja_node, struct ja_test_node, node);
- if (node->key != ka[i]) {
- fprintf(stderr, "Error lookup below equal. Expecting key %" PRIu64 " below or equal to %" PRIu64 ", but found %" PRIu64 " instead.\n",
- ka[i], key, node->key);
+ if (node->key != ka[i] || result_key != ka[i]) {
+ fprintf(stderr, "Error lookup below equal. Expecting key %" PRIu64 " below or equal to %" PRIu64 ", but found %" PRIu64 "/%" PRIu64" instead.\n",
+ ka[i], key, node->key, result_key);
assert(0);
}
- ja_node = cds_ja_lookup_above_equal(test_ja, key);
+ ja_node = cds_ja_lookup_above_equal(test_ja, key, &result_key);
if (!ja_node) {
fprintf(stderr, "Error lookup above equal. Cannot find expected key %" PRIu64" below or equal to %" PRIu64 ".\n",
ka[i], key);
assert(0);
}
node = caa_container_of(ja_node, struct ja_test_node, node);
- if (node->key != ka[i]) {
- fprintf(stderr, "Error lookup above equal. Expecting key %" PRIu64 " below or equal to %" PRIu64 ", but found %" PRIu64 " instead.\n",
- ka[i], key, node->key);
+ if (node->key != ka[i] || result_key != ka[i]) {
+ fprintf(stderr, "Error lookup above equal. Expecting key %" PRIu64 " below or equal to %" PRIu64 ", but found %" PRIu64 "/%" PRIu64" instead.\n",
+ ka[i], key, node->key, result_key);
assert(0);
}
rcu_read_unlock();
printf("OK\n");
- ret = cds_ja_destroy(test_ja, free_node);
+ ret = test_free_all_nodes(test_ja);
+ if (ret) {
+ fprintf(stderr, "Error freeing all nodes\n");
+ return -1;
+ }
+
+ ret = cds_ja_destroy(test_ja);
if (ret) {
fprintf(stderr, "Error destroying judy array\n");
return -1;
uint64_t key;
uint64_t ka[] = { 105, 206, 4000, 4111, 59990, 65435 };
uint64_t ka_test_offset = 100;
+ struct cds_ja_node *ja_node;
/* Test with 16-bit key */
test_ja = cds_ja_new(16);
printf("Test #2: successful key lookup (16-bit).\n");
for (key = 0; key < 10000; key++) {
//for (key = 0; key < 65536; key+=256) {
- struct cds_ja_node *node;
+ struct cds_ja_node *ja_node;
rcu_read_lock();
- node = cds_ja_lookup(test_ja, key);
- if (!node) {
+ ja_node = cds_ja_lookup(test_ja, key);
+ if (!ja_node) {
fprintf(stderr, "Error lookup node %" PRIu64 "\n", key);
assert(0);
}
printf("OK\n");
printf("Test #3: unsuccessful key lookup (16-bit).\n");
for (key = 11000; key <= 11002; key++) {
- struct cds_ja_node *node;
+ struct cds_ja_node *ja_node;
rcu_read_lock();
- node = cds_ja_lookup(test_ja, key);
- if (node) {
+ ja_node = cds_ja_lookup(test_ja, key);
+ if (ja_node) {
fprintf(stderr,
"Error unexpected lookup node %" PRIu64 "\n",
key);
printf("Test #4: remove keys (16-bit).\n");
for (key = 0; key < 10000; key++) {
//for (key = 0; key < 65536; key+=256) {
- struct cds_ja_node *ja_node;
struct ja_test_node *node;
rcu_read_lock();
}
printf("OK\n");
- printf("Test #5: lookup below equal (16-bit).\n");
+ printf("Test #5: lookup below/above equal (16-bit).\n");
for (i = 0; i < CAA_ARRAY_SIZE(ka); i++) {
struct ja_test_node *node = node_alloc();
}
for (i = 0; i < CAA_ARRAY_SIZE(ka); i++) {
- struct cds_ja_node *ja_node;
struct ja_test_node *node;
+ uint64_t result_key;
key = ka[i] + ka_test_offset;
rcu_read_lock();
- ja_node = cds_ja_lookup_below_equal(test_ja, key);
+ ja_node = cds_ja_lookup_below_equal(test_ja, key, &result_key);
if (!ja_node) {
fprintf(stderr, "Error lookup below equal. Cannot find expected key %" PRIu64" below or equal to %" PRIu64 ".\n",
ka[i], key);
assert(0);
}
node = caa_container_of(ja_node, struct ja_test_node, node);
- if (node->key != ka[i]) {
- fprintf(stderr, "Error lookup below equal. Expecting key %" PRIu64 " below or equal to %" PRIu64 ", but found %" PRIu64 " instead.\n",
- ka[i], key, node->key);
+ if (node->key != ka[i] || result_key != ka[i]) {
+ fprintf(stderr, "Error lookup below equal. Expecting key %" PRIu64 " below or equal to %" PRIu64 ", but found %" PRIu64 "/%" PRIu64" instead.\n",
+ ka[i], key, node->key, result_key);
assert(0);
}
rcu_read_unlock();
}
for (i = 0; i < CAA_ARRAY_SIZE(ka); i++) {
- struct cds_ja_node *ja_node;
struct ja_test_node *node;
+ uint64_t result_key;
key = ka[i] - ka_test_offset;
rcu_read_lock();
- ja_node = cds_ja_lookup_above_equal(test_ja, key);
+ ja_node = cds_ja_lookup_above_equal(test_ja, key, &result_key);
if (!ja_node) {
fprintf(stderr, "Error lookup above equal. Cannot find expected key %" PRIu64" above or equal to %" PRIu64 ".\n",
ka[i], key);
assert(0);
}
node = caa_container_of(ja_node, struct ja_test_node, node);
- if (node->key != ka[i]) {
- fprintf(stderr, "Error lookup above equal. Expecting key %" PRIu64 " above or equal to %" PRIu64 ", but found %" PRIu64 " instead.\n",
- ka[i], key, node->key);
+ if (node->key != ka[i] || result_key != ka[i]) {
+ fprintf(stderr, "Error lookup above equal. Expecting key %" PRIu64 " above or equal to %" PRIu64 ", but found %" PRIu64 "/%" PRIu64" instead.\n",
+ ka[i], key, node->key, result_key);
assert(0);
}
rcu_read_unlock();
}
for (i = 0; i < CAA_ARRAY_SIZE(ka); i++) {
- struct cds_ja_node *ja_node;
struct ja_test_node *node;
+ uint64_t result_key;
key = ka[i]; /* without offset */
rcu_read_lock();
- ja_node = cds_ja_lookup_below_equal(test_ja, key);
+ ja_node = cds_ja_lookup_below_equal(test_ja, key, &result_key);
if (!ja_node) {
fprintf(stderr, "Error lookup below equal. Cannot find expected key %" PRIu64" below or equal to %" PRIu64 ".\n",
ka[i], key);
assert(0);
}
node = caa_container_of(ja_node, struct ja_test_node, node);
- if (node->key != ka[i]) {
- fprintf(stderr, "Error lookup below equal. Expecting key %" PRIu64 " below or equal to %" PRIu64 ", but found %" PRIu64 " instead.\n",
- ka[i], key, node->key);
+ if (node->key != ka[i] || result_key != ka[i]) {
+ fprintf(stderr, "Error lookup below equal. Expecting key %" PRIu64 " below or equal to %" PRIu64 ", but found %" PRIu64 "/%" PRIu64" instead.\n",
+ ka[i], key, node->key, result_key);
assert(0);
}
- ja_node = cds_ja_lookup_above_equal(test_ja, key);
+ ja_node = cds_ja_lookup_above_equal(test_ja, key, &result_key);
if (!ja_node) {
fprintf(stderr, "Error lookup above equal. Cannot find expected key %" PRIu64" above or equal to %" PRIu64 ".\n",
ka[i], key);
assert(0);
}
node = caa_container_of(ja_node, struct ja_test_node, node);
- if (node->key != ka[i]) {
- fprintf(stderr, "Error lookup above equal. Expecting key %" PRIu64 " above or equal to %" PRIu64 ", but found %" PRIu64 " instead.\n",
- ka[i], key, node->key);
+ if (node->key != ka[i] || result_key != ka[i]) {
+ fprintf(stderr, "Error lookup above equal. Expecting key %" PRIu64 " above or equal to %" PRIu64 ", but found %" PRIu64 "/%" PRIu64" instead.\n",
+ ka[i], key, node->key, result_key);
assert(0);
}
rcu_read_unlock();
printf("OK\n");
- ret = cds_ja_destroy(test_ja, free_node);
+ ret = test_free_all_nodes(test_ja);
+ if (ret) {
+ fprintf(stderr, "Error freeing all nodes\n");
+ return -1;
+ }
+
+ ret = cds_ja_destroy(test_ja);
if (ret) {
fprintf(stderr, "Error destroying judy array\n");
return -1;
{
uint64_t key, max_key;
int zerocount, i, ret;
+ struct cds_ja_node *ja_node;
if (bits == 64)
max_key = UINT64_MAX;
printf("Test #2: successful key lookup (%u-bit).\n", bits);
zerocount = 0;
for (key = 0; key <= max_key && (key != 0 || zerocount < 1); key += 1ULL << (bits - 8)) {
- struct cds_ja_node *ja_node;
struct ja_test_node *node;
int count = 0;
printf("Test #3: unsuccessful key lookup (%u-bit).\n", bits);
zerocount = 0;
for (key = 0; key <= max_key && (key != 0 || zerocount < 1); key += 1ULL << (bits - 8)) {
- struct cds_ja_node *ja_node;
-
rcu_read_lock();
ja_node = cds_ja_lookup(test_ja, key + 42);
if (ja_node) {
printf("Test #4: remove keys (%u-bit).\n", bits);
zerocount = 0;
for (key = 0; key <= max_key && (key != 0 || zerocount < 1); key += 1ULL << (bits - 8)) {
- struct cds_ja_node *ja_node;
int count = 0;
rcu_read_lock();
}
printf("OK\n");
- ret = cds_ja_destroy(test_ja, free_node);
+ ret = test_free_all_nodes(test_ja);
+ if (ret) {
+ fprintf(stderr, "Error freeing all nodes\n");
+ return -1;
+ }
+
+ ret = cds_ja_destroy(test_ja);
if (ret) {
fprintf(stderr, "Error destroying judy array\n");
return -1;
struct cds_ja_node *ja_node;
uint64_t key;
- printf_verbose("thread_begin %s, thread id : %lx, tid %lu\n",
- "reader", pthread_self(), (unsigned long) gettid());
+ printf_verbose("thread_begin %s, tid %lu\n",
+ "reader", urcu_get_thread_id());
+
+ URCU_TLS(rand_lookup) = urcu_get_thread_id() ^ time(NULL);
set_affinity();
rcu_unregister_thread();
*count = URCU_TLS(nr_reads);
- printf_verbose("thread_end %s, thread id : %lx, tid %lu\n",
- "reader", pthread_self(), (unsigned long) gettid());
+ printf_verbose("thread_end %s, tid %lu\n",
+ "reader", urcu_get_thread_id());
printf_verbose("readid : %lx, lookupfail %lu, lookupok %lu\n",
pthread_self(), URCU_TLS(lookup_fail),
URCU_TLS(lookup_ok));
uint64_t key;
int ret;
- printf_verbose("thread_begin %s, thread id : %lx, tid %lu\n",
- "writer", pthread_self(), (unsigned long) gettid());
+ printf_verbose("thread_begin %s, tid %lu\n",
+ "writer", urcu_get_thread_id());
+
+ URCU_TLS(rand_lookup) = urcu_get_thread_id() ^ time(NULL);
set_affinity();
rcu_unregister_thread();
- printf_verbose("thread_end %s, thread id : %lx, tid %lu\n",
- "writer", pthread_self(), (unsigned long) gettid());
+ printf_verbose("thread_end %s, tid %lu\n",
+ "writer", urcu_get_thread_id());
printf_verbose("info id %lx: nr_add %lu, nr_addexist %lu, nr_del %lu, "
"nr_delnoent %lu\n", pthread_self(), URCU_TLS(nr_add),
URCU_TLS(nr_addexist), URCU_TLS(nr_del),
URCU_TLS(nr_add)++;
URCU_TLS(nr_writes)++;
rcu_read_unlock();
+ /* Hash table resize only occurs in call_rcu thread */
+ if (!(iter % 100))
+ rcu_quiescent_state();
if (ret) {
fprintf(stderr, "Error (%d) adding node %" PRIu64 "\n",
ret, key);
}
rcu_thread_online_qsbr();
- ret = cds_ja_destroy(test_ja, free_node);
+ ret = test_free_all_nodes(test_ja);
+ if (ret) {
+ fprintf(stderr, "Error freeing all nodes\n");
+ return -1;
+ }
+
+ ret = cds_ja_destroy(test_ja);
if (ret) {
fprintf(stderr, "Error destroying judy array\n");
goto end;
printf_verbose("Validating lookups.\n");
if (leak_detection)
printf_verbose("Memory leak dection activated.\n");
- printf_verbose("thread %-6s, thread id : %lx, tid %lu\n",
- "main", pthread_self(), (unsigned long)gettid());
+ printf_verbose("thread %-6s, tid %lu\n",
+ "main", urcu_get_thread_id());
memset(&act, 0, sizeof(act));
ret = sigemptyset(&act.sa_mask);