X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=rcuja%2Frcuja-internal.h;h=d4bc32e0f33ea8c1740fb1ce801f69b44432e574;hb=0c0113e0204bc74c13229721f70fc991ce0f7f04;hp=1a3346bbbe96aa4b0ae44896bf51ad476404481f;hpb=03ec1aebe1d8eaa2b03a12b501e5b988efc0a6d0;p=userspace-rcu.git diff --git a/rcuja/rcuja-internal.h b/rcuja/rcuja-internal.h index 1a3346b..d4bc32e 100644 --- a/rcuja/rcuja-internal.h +++ b/rcuja/rcuja-internal.h @@ -140,11 +140,36 @@ void ja_node_pool_2d_bitsel(struct cds_ja_inode_flag *node, unsigned long *bits) bits[1] = ((unsigned long) node & JA_POOL_1D_MASK) >> JA_TYPE_BITS; } -__attribute__((visibility("protected"))) -unsigned long ja_node_type(struct cds_ja_inode_flag *node); +/* Hardcoded pool indexes for fast path */ +#define RCU_JA_POOL_IDX_5 5 +#define RCU_JA_POOL_IDX_6 6 +static inline +struct cds_ja_inode *ja_node_ptr(struct cds_ja_inode_flag *node) +{ + unsigned long v, type_idx; + + if (!node) + return NULL; /* RCU_JA_NULL */ + v = (unsigned long) node; + type_idx = v & JA_TYPE_MASK; + + switch (type_idx) { + case RCU_JA_POOL_IDX_5: + v &= ~(JA_POOL_1D_MASK | JA_TYPE_MASK); + break; + case RCU_JA_POOL_IDX_6: + v &= ~(JA_POOL_2D_MASK | JA_POOL_1D_MASK | JA_TYPE_MASK); + break; + default: + /* RCU_JA_LINEAR or RCU_JA_PIGEON */ + v &= JA_PTR_MASK; + break; + } + return (struct cds_ja_inode *) v; +} __attribute__((visibility("protected"))) -struct cds_ja_inode *ja_node_ptr(struct cds_ja_inode_flag *node); +unsigned long ja_node_type(struct cds_ja_inode_flag *node); __attribute__((visibility("protected"))) void rcuja_free_all_children(struct cds_ja_shadow_node *shadow_node,