{ .type_class = RCU_JA_LINEAR, .min_child = 10, .max_child = ja_type_4_max_child, .max_linear_child = ja_type_4_max_linear_child, .order = 7, },
/* Pools may fill sooner than max_child */
+ /* This pool is hardcoded at index 5. See ja_node_ptr(). */
{ .type_class = RCU_JA_POOL, .min_child = 20, .max_child = ja_type_5_max_child, .max_linear_child = ja_type_5_max_linear_child, .order = 8, .nr_pool_order = ja_type_5_nr_pool_order, .pool_size_order = 7, },
+ /* This pool is hardcoded at index 6. See ja_node_ptr(). */
{ .type_class = RCU_JA_POOL, .min_child = 45, .max_child = ja_type_6_max_child, .max_linear_child = ja_type_6_max_linear_child, .order = 9, .nr_pool_order = ja_type_6_nr_pool_order, .pool_size_order = 7, },
/*
{ .type_class = RCU_JA_LINEAR, .min_child = 10, .max_child = ja_type_4_max_child, .max_linear_child = ja_type_4_max_linear_child, .order = 8, },
/* Pools may fill sooner than max_child. */
+ /* This pool is hardcoded at index 5. See ja_node_ptr(). */
{ .type_class = RCU_JA_POOL, .min_child = 22, .max_child = ja_type_5_max_child, .max_linear_child = ja_type_5_max_linear_child, .order = 9, .nr_pool_order = ja_type_5_nr_pool_order, .pool_size_order = 8, },
+ /* This pool is hardcoded at index 6. See ja_node_ptr(). */
{ .type_class = RCU_JA_POOL, .min_child = 51, .max_child = ja_type_6_max_child, .max_linear_child = ja_type_6_max_linear_child, .order = 10, .nr_pool_order = ja_type_6_nr_pool_order, .pool_size_order = 8, },
/*
return type;
}
-struct cds_ja_inode *ja_node_ptr(struct cds_ja_inode_flag *node)
-{
- unsigned long type_index = ja_node_type(node);
- const struct cds_ja_type *type;
-
- type = &ja_types[type_index];
- switch (type->type_class) {
- case RCU_JA_LINEAR:
- case RCU_JA_PIGEON: /* fall-through */
- case RCU_JA_NULL: /* fall-through */
- default: /* fall-through */
- return _ja_node_mask_ptr(node);
- case RCU_JA_POOL:
- switch (type->nr_pool_order) {
- case 1:
- return (struct cds_ja_inode *) (((unsigned long) node) & ~(JA_POOL_1D_MASK | JA_TYPE_MASK));
- case 2:
- return (struct cds_ja_inode *) (((unsigned long) node) & ~(JA_POOL_2D_MASK | JA_POOL_1D_MASK | JA_TYPE_MASK));
- default:
- assert(0);
- }
- }
-}
-
static
struct cds_ja_inode *alloc_cds_ja_node(struct cds_ja *ja,
const struct cds_ja_type *ja_type)
for (bit_i = 0; bit_i < JA_BITS_PER_BYTE; bit_i++) {
unsigned int distance_to_best;
- distance_to_best = abs_int((nr_one[bit_i] << 1U) - distrib_nr_child);
+ distance_to_best = abs_int(((unsigned int) nr_one[bit_i] << 1U) - distrib_nr_child);
if (distance_to_best < overall_best_distance) {
overall_best_distance = distance_to_best;
bitsel = bit_i;
continue;
for (bit_i = 0; bit_i < JA_BITS_PER_BYTE; bit_i++) {
for (bit_j = 0; bit_j < bit_i; bit_j++) {
- if ((v & (1U << bit_i)) && (v & (1U << bit_j))) {
- nr_2d_11[bit_i][bit_j]++;
- }
- if ((v & (1U << bit_i)) && !(v & (1U << bit_j))) {
- nr_2d_10[bit_i][bit_j]++;
- }
- if (!(v & (1U << bit_i)) && (v & (1U << bit_j))) {
- nr_2d_01[bit_i][bit_j]++;
- }
- if (!(v & (1U << bit_i)) && !(v & (1U << bit_j))) {
- nr_2d_00[bit_i][bit_j]++;
+ if (v & (1U << bit_i)) {
+ if (v & (1U << bit_j)) {
+ nr_2d_11[bit_i][bit_j]++;
+ } else {
+ nr_2d_10[bit_i][bit_j]++;
+ }
+ } else {
+ if (v & (1U << bit_j)) {
+ nr_2d_01[bit_i][bit_j]++;
+ } else {
+ nr_2d_00[bit_i][bit_j]++;
+ }
}
}
}
continue;
for (bit_i = 0; bit_i < JA_BITS_PER_BYTE; bit_i++) {
for (bit_j = 0; bit_j < bit_i; bit_j++) {
- if ((v & (1U << bit_i)) && (v & (1U << bit_j))) {
- nr_2d_11[bit_i][bit_j]++;
- }
- if ((v & (1U << bit_i)) && !(v & (1U << bit_j))) {
- nr_2d_10[bit_i][bit_j]++;
- }
- if (!(v & (1U << bit_i)) && (v & (1U << bit_j))) {
- nr_2d_01[bit_i][bit_j]++;
- }
- if (!(v & (1U << bit_i)) && !(v & (1U << bit_j))) {
- nr_2d_00[bit_i][bit_j]++;
+ if (v & (1U << bit_i)) {
+ if (v & (1U << bit_j)) {
+ nr_2d_11[bit_i][bit_j]++;
+ } else {
+ nr_2d_10[bit_i][bit_j]++;
+ }
+ } else {
+ if (v & (1U << bit_j)) {
+ nr_2d_01[bit_i][bit_j]++;
+ } else {
+ nr_2d_00[bit_i][bit_j]++;
+ }
}
}
}
continue;
for (bit_i = 0; bit_i < JA_BITS_PER_BYTE; bit_i++) {
for (bit_j = 0; bit_j < bit_i; bit_j++) {
- if ((i & (1U << bit_i)) && (i & (1U << bit_j))) {
- nr_2d_11[bit_i][bit_j]++;
- }
- if ((i & (1U << bit_i)) && !(i & (1U << bit_j))) {
- nr_2d_10[bit_i][bit_j]++;
- }
- if (!(i & (1U << bit_i)) && (i & (1U << bit_j))) {
- nr_2d_01[bit_i][bit_j]++;
- }
- if (!(i & (1U << bit_i)) && !(i & (1U << bit_j))) {
- nr_2d_00[bit_i][bit_j]++;
+ if (i & (1U << bit_i)) {
+ if (i & (1U << bit_j)) {
+ nr_2d_11[bit_i][bit_j]++;
+ } else {
+ nr_2d_10[bit_i][bit_j]++;
+ }
+ } else {
+ if (i & (1U << bit_j)) {
+ nr_2d_01[bit_i][bit_j]++;
+ } else {
+ nr_2d_00[bit_i][bit_j]++;
+ }
}
}
}
if (mode == JA_RECOMPACT_ADD_NEXT || mode == JA_RECOMPACT_ADD_SAME) {
for (bit_i = 0; bit_i < JA_BITS_PER_BYTE; bit_i++) {
for (bit_j = 0; bit_j < bit_i; bit_j++) {
- if ((n & (1U << bit_i)) && (n & (1U << bit_j))) {
- nr_2d_11[bit_i][bit_j]++;
- }
- if ((n & (1U << bit_i)) && !(n & (1U << bit_j))) {
- nr_2d_10[bit_i][bit_j]++;
- }
- if (!(n & (1U << bit_i)) && (n & (1U << bit_j))) {
- nr_2d_01[bit_i][bit_j]++;
- }
- if (!(n & (1U << bit_i)) && !(n & (1U << bit_j))) {
- nr_2d_00[bit_i][bit_j]++;
+ if (n & (1U << bit_i)) {
+ if (n & (1U << bit_j)) {
+ nr_2d_11[bit_i][bit_j]++;
+ } else {
+ nr_2d_10[bit_i][bit_j]++;
+ }
+ } else {
+ if (n & (1U << bit_j)) {
+ nr_2d_01[bit_i][bit_j]++;
+ } else {
+ nr_2d_00[bit_i][bit_j]++;
+ }
}
}
}
for (bit_j = 0; bit_j < bit_i; bit_j++) {
int distance_to_best[4];
- distance_to_best[0] = (nr_2d_11[bit_i][bit_j] << 2U) - distrib_nr_child;
- distance_to_best[1] = (nr_2d_10[bit_i][bit_j] << 2U) - distrib_nr_child;
- distance_to_best[2] = (nr_2d_01[bit_i][bit_j] << 2U) - distrib_nr_child;
- distance_to_best[3] = (nr_2d_00[bit_i][bit_j] << 2U) - distrib_nr_child;
+ distance_to_best[0] = ((unsigned int) nr_2d_11[bit_i][bit_j] << 2U) - distrib_nr_child;
+ distance_to_best[1] = ((unsigned int) nr_2d_10[bit_i][bit_j] << 2U) - distrib_nr_child;
+ distance_to_best[2] = ((unsigned int) nr_2d_01[bit_i][bit_j] << 2U) - distrib_nr_child;
+ distance_to_best[3] = ((unsigned int) nr_2d_00[bit_i][bit_j] << 2U) - distrib_nr_child;
/* Consider worse distance above best */
if (distance_to_best[1] > 0 && distance_to_best[1] > distance_to_best[0])
static
int _cds_ja_add(struct cds_ja *ja, uint64_t key,
- struct cds_ja_node *new_node,
+ struct cds_ja_node *node,
struct cds_ja_node **unique_node_ret)
{
unsigned int tree_depth, i;
retry:
dbg_printf("cds_ja_add attempt: key %" PRIu64 ", node %p\n",
- key, new_node);
+ key, node);
parent2_node_flag = NULL;
parent_node_flag =
(struct cds_ja_inode_flag *) &ja->root; /* Use root ptr address as key for mutex */
parent_attach_node_flag,
node_flag_ptr,
node_flag,
- key, i, new_node);
+ key, i, node);
} else {
if (unique_node_ret) {
*unique_node_ret = (struct cds_ja_node *) ja_node_ptr(node_flag);
parent_attach_node_flag,
attach_node_flag_ptr,
attach_node_flag,
- new_node);
+ node);
}
if (ret == -EAGAIN || ret == -EEXIST)
goto retry;
}
int cds_ja_add(struct cds_ja *ja, uint64_t key,
- struct cds_ja_node *new_node)
+ struct cds_ja_node *node)
{
- return _cds_ja_add(ja, key, new_node, NULL);
+ return _cds_ja_add(ja, key, node, NULL);
}
struct cds_ja_node *cds_ja_add_unique(struct cds_ja *ja, uint64_t key,
- struct cds_ja_node *new_node)
+ struct cds_ja_node *node)
{
int ret;
struct cds_ja_node *ret_node;
- ret = _cds_ja_add(ja, key, new_node, &ret_node);
+ ret = _cds_ja_add(ja, key, node, &ret_node);
if (ret == -EEXIST)
return ret_node;
else
- return new_node;
+ return node;
}
/*