X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=rcuja%2Frcuja.c;h=9398a222bcd526fc4d3dcd1f86e851a02a17ced4;hb=refs%2Fheads%2Furcu%2Frcuja-range;hp=a16385b06f0f923dc5e2c603a7d3948057411d09;hpb=28fd1038095007b48a9f81ee13cadcdff62853ef;p=userspace-rcu.git diff --git a/rcuja/rcuja.c b/rcuja/rcuja.c index a16385b..9398a22 100644 --- a/rcuja/rcuja.c +++ b/rcuja/rcuja.c @@ -290,14 +290,15 @@ struct cds_ja_inode *alloc_cds_ja_node(struct cds_ja *ja, return NULL; } memset(p, 0, len); - uatomic_inc(&ja->nr_nodes_allocated); + if (ja_debug_counters()) + uatomic_inc(&ja->nr_nodes_allocated); return p; } void free_cds_ja_node(struct cds_ja *ja, struct cds_ja_inode *node) { free(node); - if (node) + if (ja_debug_counters() && node) uatomic_inc(&ja->nr_nodes_freed); } @@ -370,9 +371,9 @@ struct cds_ja_inode_flag *ja_linear_node_get_direction(const struct cds_ja_type uint8_t nr_child; uint8_t *values; struct cds_ja_inode_flag **pointers; - struct cds_ja_inode_flag *ptr = NULL; + struct cds_ja_inode_flag *ptr, *match_ptr = NULL; unsigned int i; - int match_idx = -1, match_v; + int match_v; assert(type->type_class == RCU_JA_LINEAR || type->type_class == RCU_JA_POOL); assert(dir == JA_LEFT || dir == JA_RIGHT); @@ -400,24 +401,23 @@ struct cds_ja_inode_flag *ja_linear_node_get_direction(const struct cds_ja_type if (dir == JA_LEFT) { if ((int) v < n && (int) v > match_v) { match_v = v; - match_idx = i; + match_ptr = ptr; } } else { if ((int) v > n && (int) v < match_v) { match_v = v; - match_idx = i; + match_ptr = ptr; } } } - if (match_idx < 0) { + if (!match_ptr) { return NULL; } assert(match_v >= 0 && match_v < JA_ENTRY_PER_NODE); *result_key = (uint8_t) match_v; - ptr = rcu_dereference(pointers[match_idx]); - return ptr; + return rcu_dereference(match_ptr); } static @@ -1606,7 +1606,8 @@ skip_copy: dbg_printf("Using fallback for %u children, node type index: %u, mode %s\n", new_shadow_node->nr_child, old_type_index, mode == JA_RECOMPACT_ADD_NEXT ? "add_next" : (mode == JA_RECOMPACT_DEL ? "del" : "add_same")); - uatomic_inc(&ja->node_fallback_count_distribution[new_shadow_node->nr_child]); + if (ja_debug_counters()) + uatomic_inc(&ja->node_fallback_count_distribution[new_shadow_node->nr_child]); } /* Return pointer to new recompacted node through old_node_flag_ptr */ @@ -1672,7 +1673,8 @@ fallback_toosmall: } else { new_type_index++; dbg_printf("Add fallback to type %d\n", new_type_index); - uatomic_inc(&ja->nr_fallback); + if (ja_debug_counters()) + uatomic_inc(&ja->nr_fallback); fallback = 1; goto retry; } @@ -1784,7 +1786,7 @@ struct cds_ja_node *cds_ja_lookup(struct cds_ja *ja, uint64_t key) unsigned int tree_depth, i; struct cds_ja_inode_flag *node_flag; - if (caa_unlikely(key > ja->key_max)) + if (caa_unlikely(key > ja->key_max || key == UINT64_MAX)) return NULL; tree_depth = ja->tree_depth; node_flag = rcu_dereference(ja->root); @@ -1820,11 +1822,8 @@ struct cds_ja_node *cds_ja_lookup_inequality(struct cds_ja *ja, uint64_t key, switch (mode) { case JA_LOOKUP_BE: - if (caa_unlikely(key > ja->key_max || key == 0)) - return NULL; - break; case JA_LOOKUP_AE: - if (caa_unlikely(key >= ja->key_max)) + if (caa_unlikely(key > ja->key_max || key == UINT64_MAX)) return NULL; break; default: @@ -2202,7 +2201,7 @@ int _cds_ja_add(struct cds_ja *ja, uint64_t key, **node_flag_ptr; int ret; - if (caa_unlikely(key > ja->key_max)) { + if (caa_unlikely(key > ja->key_max || key == UINT64_MAX)) { return -EINVAL; } tree_depth = ja->tree_depth; @@ -2533,7 +2532,7 @@ int cds_ja_del(struct cds_ja *ja, uint64_t key, int nr_snapshot; int ret; - if (caa_unlikely(key > ja->key_max)) + if (caa_unlikely(key > ja->key_max || key == UINT64_MAX)) return -EINVAL; tree_depth = ja->tree_depth; @@ -2702,6 +2701,9 @@ int ja_final_checks(struct cds_ja *ja) unsigned long na, nf, nr_fallback; int ret = 0; + if (!ja_debug_counters()) + return 0; + fallback_ratio = (double) uatomic_read(&ja->nr_fallback); fallback_ratio /= (double) uatomic_read(&ja->nr_nodes_allocated); nr_fallback = uatomic_read(&ja->nr_fallback);