}
static
-void free_node_cb(struct rcu_head *head)
+void free_node(struct ja_test_node *node)
{
- struct ja_test_node *node =
- caa_container_of(head, struct ja_test_node, node.head);
poison_free(node);
if (leak_detection)
uatomic_inc(&test_nodes_freed);
}
+static
+void free_node_cb(struct rcu_head *head)
+{
+ struct ja_test_node *node =
+ caa_container_of(head, struct ja_test_node, head);
+ free_node(node);
+}
+
+static
+void rcu_free_test_node(struct ja_test_node *test_node)
+{
+ call_rcu(&test_node->head, free_node_cb);
+}
+
+static
+void rcu_free_node(struct cds_ja_node *node)
+{
+ struct ja_test_node *test_node = to_test_node(node);
+
+ rcu_free_test_node(test_node);
+}
+
#if 0
static
void test_delete_all_nodes(struct cds_lfht *ht)
printf("\n\n");
}
-
static
int test_8bit_key(void)
{
- int ret;
+ int ret, i;
uint64_t key;
+ uint64_t ka[] = { 4, 17, 100, 222 };
+ uint64_t ka_test_offset = 5;
/* Test with 8-bit key */
test_ja = cds_ja_new(8);
fprintf(stderr, "Error (%d) removing node %" PRIu64 "\n", ret, key);
assert(0);
}
- call_rcu(&node->node.head, free_node_cb);
+ rcu_free_test_node(node);
head = cds_ja_lookup(test_ja, key);
if (!cds_hlist_empty(&head)) {
fprintf(stderr, "Error lookup %" PRIu64 ": %p (after delete) failed. Node is not expected.\n", key, head.next);
}
printf("OK\n");
- ret = cds_ja_destroy(test_ja, free_node_cb);
+ printf("Test #5: lookup lower equal (8-bit).\n");
+
+ for (i = 0; i < CAA_ARRAY_SIZE(ka); i++) {
+ struct ja_test_node *node = node_alloc();
+
+ key = ka[i];
+ ja_test_node_init(node, key);
+ rcu_read_lock();
+ ret = cds_ja_add(test_ja, key, &node->node);
+ rcu_read_unlock();
+ if (ret) {
+ fprintf(stderr, "Error (%d) adding node %" PRIu64 "\n",
+ ret, key);
+ assert(0);
+ }
+ }
+
+ for (i = 0; i < CAA_ARRAY_SIZE(ka); i++) {
+ struct cds_hlist_head head;
+ struct ja_test_node *node;
+
+ key = ka[i] + ka_test_offset;
+ rcu_read_lock();
+ head = cds_ja_lookup_lower_equal(test_ja, key);
+ if (cds_hlist_empty(&head)) {
+ fprintf(stderr, "Error lookup lower equal. Cannot find expected key %" PRIu64" below or equal to %" PRIu64 ".\n",
+ ka[i], key);
+ assert(0);
+ }
+ node = cds_hlist_first_entry_rcu(&head, struct ja_test_node, node.list);
+ if (node->key != ka[i]) {
+ fprintf(stderr, "Error lookup lower equal. Expecting key %" PRIu64 " below or equal to %" PRIu64 ", but found %" PRIu64 " instead.\n",
+ ka[i], key, node->key);
+ assert(0);
+ }
+ rcu_read_unlock();
+ }
+
+ for (i = 0; i < CAA_ARRAY_SIZE(ka); i++) {
+ struct cds_hlist_head head;
+ struct ja_test_node *node;
+
+ key = ka[i]; /* without offset */
+ rcu_read_lock();
+ head = cds_ja_lookup_lower_equal(test_ja, key);
+ if (cds_hlist_empty(&head)) {
+ fprintf(stderr, "Error lookup lower equal. Cannot find expected key %" PRIu64" below or equal to %" PRIu64 ".\n",
+ ka[i], key);
+ assert(0);
+ }
+ node = cds_hlist_first_entry_rcu(&head, struct ja_test_node, node.list);
+ if (node->key != ka[i]) {
+ fprintf(stderr, "Error lookup lower equal. Expecting key %" PRIu64 " below or equal to %" PRIu64 ", but found %" PRIu64 " instead.\n",
+ ka[i], key, node->key);
+ assert(0);
+ }
+ rcu_read_unlock();
+ }
+
+ printf("OK\n");
+
+ ret = cds_ja_destroy(test_ja, rcu_free_node);
if (ret) {
fprintf(stderr, "Error destroying judy array\n");
return -1;
static
int test_16bit_key(void)
{
- int ret;
+ int ret, i;
uint64_t key;
+ uint64_t ka[] = { 4, 105, 222, 4000, 4111, 59990, 65435 };
+ uint64_t ka_test_offset = 100;
/* Test with 16-bit key */
test_ja = cds_ja_new(16);
fprintf(stderr, "Error (%d) removing node %" PRIu64 "\n", ret, key);
assert(0);
}
- call_rcu(&node->node.head, free_node_cb);
+ rcu_free_test_node(node);
head = cds_ja_lookup(test_ja, key);
if (!cds_hlist_empty(&head)) {
fprintf(stderr, "Error lookup %" PRIu64 ": %p (after delete) failed. Node is not expected.\n", key, head.next);
}
printf("OK\n");
- ret = cds_ja_destroy(test_ja, free_node_cb);
+ printf("Test #5: lookup lower equal (16-bit).\n");
+
+ for (i = 0; i < CAA_ARRAY_SIZE(ka); i++) {
+ struct ja_test_node *node = node_alloc();
+
+ key = ka[i];
+ ja_test_node_init(node, key);
+ rcu_read_lock();
+ ret = cds_ja_add(test_ja, key, &node->node);
+ rcu_read_unlock();
+ if (ret) {
+ fprintf(stderr, "Error (%d) adding node %" PRIu64 "\n",
+ ret, key);
+ assert(0);
+ }
+ }
+
+ for (i = 0; i < CAA_ARRAY_SIZE(ka); i++) {
+ struct cds_hlist_head head;
+ struct ja_test_node *node;
+
+ key = ka[i] + ka_test_offset;
+ rcu_read_lock();
+ head = cds_ja_lookup_lower_equal(test_ja, key);
+ if (cds_hlist_empty(&head)) {
+ fprintf(stderr, "Error lookup lower equal. Cannot find expected key %" PRIu64" below or equal to %" PRIu64 ".\n",
+ ka[i], key);
+ assert(0);
+ }
+ node = cds_hlist_first_entry_rcu(&head, struct ja_test_node, node.list);
+ if (node->key != ka[i]) {
+ fprintf(stderr, "Error lookup lower equal. Expecting key %" PRIu64 " below or equal to %" PRIu64 ", but found %" PRIu64 " instead.\n",
+ ka[i], key, node->key);
+ assert(0);
+ }
+ rcu_read_unlock();
+ }
+
+ for (i = 0; i < CAA_ARRAY_SIZE(ka); i++) {
+ struct cds_hlist_head head;
+ struct ja_test_node *node;
+
+ key = ka[i]; /* without offset */
+ rcu_read_lock();
+ head = cds_ja_lookup_lower_equal(test_ja, key);
+ if (cds_hlist_empty(&head)) {
+ fprintf(stderr, "Error lookup lower equal. Cannot find expected key %" PRIu64" below or equal to %" PRIu64 ".\n",
+ ka[i], key);
+ assert(0);
+ }
+ node = cds_hlist_first_entry_rcu(&head, struct ja_test_node, node.list);
+ if (node->key != ka[i]) {
+ fprintf(stderr, "Error lookup lower equal. Expecting key %" PRIu64 " below or equal to %" PRIu64 ", but found %" PRIu64 " instead.\n",
+ ka[i], key, node->key);
+ assert(0);
+ }
+ rcu_read_unlock();
+ }
+
+ printf("OK\n");
+
+ ret = cds_ja_destroy(test_ja, rcu_free_node);
if (ret) {
fprintf(stderr, "Error destroying judy array\n");
return -1;
}
printf("OK\n");
}
- printf("Test #4: remove keys (16-bit).\n");
+ 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_hlist_head head;
fprintf(stderr, "Error (%d) removing node %" PRIu64 "\n", ret, key);
assert(0);
}
- call_rcu(&node->node.head, free_node_cb);
+ rcu_free_test_node(node);
testhead = cds_ja_lookup(test_ja, key);
if (count < nr_dup && cds_hlist_empty(&testhead)) {
fprintf(stderr, "Error: no node found after deletion of some nodes of a key\n");
}
printf("OK\n");
- ret = cds_ja_destroy(test_ja, free_node_cb);
+ ret = cds_ja_destroy(test_ja, rcu_free_node);
if (ret) {
fprintf(stderr, "Error destroying judy array\n");
return -1;
if (add_unique) {
ret_node = cds_ja_add_unique(test_ja, key, &node->node);
if (ret_node != &node->node) {
- free(node);
+ free_node(node);
URCU_TLS(nr_addexist)++;
} else {
URCU_TLS(nr_add)++;
ret = cds_ja_add(test_ja, key, &node->node);
if (ret) {
fprintf(stderr, "Error in cds_ja_add: %d\n", ret);
- free(node);
+ free_node(node);
} else {
URCU_TLS(nr_add)++;
}
if (node) {
ret = cds_ja_del(test_ja, key, &node->node);
if (!ret) {
- call_rcu(&node->node.head, free_node_cb);
+ rcu_free_test_node(node);
URCU_TLS(nr_del)++;
} else {
URCU_TLS(nr_delnoent)++;
}
rcu_thread_online_qsbr();
- ret = cds_ja_destroy(test_ja, free_node_cb);
+ ret = cds_ja_destroy(test_ja, rcu_free_node);
if (ret) {
fprintf(stderr, "Error destroying judy array\n");
goto end;