X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=rcuja%2Frcuja-internal.h;h=551cad68cbe0ccf6711a9f535373a10cac8ece6f;hb=be9a7474cac017c7d0bed96efdb86e50ed0f6376;hp=604cb8ea03a44d74474105a987679512a87fe020;hpb=61009379872b40dbd0d69bb3baaf82e55ec58b39;p=userspace-rcu.git diff --git a/rcuja/rcuja-internal.h b/rcuja/rcuja-internal.h index 604cb8e..551cad6 100644 --- a/rcuja/rcuja-internal.h +++ b/rcuja/rcuja-internal.h @@ -23,5 +23,69 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include +#include + +/* Never declared. Opaque type used to store flagged node pointers. */ +struct cds_ja_node_flag; + +/* + * Shadow node contains mutex and call_rcu head associated with a node. + */ +struct cds_ja_shadow_node { + struct cds_lfht_node ht_node; /* hash table node */ + struct cds_ja_node *node; /* reverse mapping and hash table key */ + /* + * mutual exclusion on all nodes belonging to the same tree + * position (e.g. both nodes before and after recompaction + * use the same lock). + */ + pthread_mutex_t *lock; + unsigned int nr_child; /* number of children in node */ + struct rcu_head head; /* for deferred node and shadow node reclaim */ +}; + +struct cds_ja { + struct cds_ja_node_flag *root; + /* + * We use a hash table to associate node keys to their + * respective shadow node. This helps reducing lookup hot path + * cache footprint, especially for very small nodes. + */ + struct cds_lfht *ht; +}; + +__attribute__((visibility("protected"))) +struct cds_ja_shadow_node *rcuja_shadow_lookup_lock(struct cds_lfht *ht, + struct cds_ja_node *node); + +__attribute__((visibility("protected"))) +void rcuja_shadow_unlock(struct cds_ja_shadow_node *shadow_node); + +__attribute__((visibility("protected"))) +int rcuja_shadow_set(struct cds_lfht *ht, + struct cds_ja_node *new_node, + struct cds_ja_shadow_node *inherit_from); + +/* rcuja_shadow_clear flags */ +enum { + RCUJA_SHADOW_CLEAR_FREE_NODE = (1U << 0), + RCUJA_SHADOW_CLEAR_FREE_LOCK = (1U << 1), +}; + +__attribute__((visibility("protected"))) +int rcuja_shadow_clear(struct cds_lfht *ht, + struct cds_ja_node *node, + unsigned int flags); + +__attribute__((visibility("protected"))) +void rcuja_shadow_prune(struct cds_lfht *ht, + unsigned int flags); + +__attribute__((visibility("protected"))) +struct cds_lfht *rcuja_create_ht(const struct rcu_flavor_struct *flavor); + +__attribute__((visibility("protected"))) +int rcuja_delete_ht(struct cds_lfht *ht); #endif /* _URCU_RCUJA_INTERNAL_H */