rcuja: new and destroy
[userspace-rcu.git] / rcuja / rcuja-internal.h
index 604cb8ea03a44d74474105a987679512a87fe020..551cad68cbe0ccf6711a9f535373a10cac8ece6f 100644 (file)
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include <pthread.h>
+#include <urcu/rculfhash.h>
+
+/* 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 */
This page took 0.02508 seconds and 4 git commands to generate.