rculfhash: Relax atomicity guarantees required by removal operation
[urcu.git] / urcu / rculfhash.h
index 7b9c5e4ebceef0e734f504e70acc569eb0e8ffd3..647592b9cf05654598dc76f1867a0455fb1eaac6 100644 (file)
@@ -39,8 +39,8 @@ extern "C" {
  * cds_lfht_node: Contains the next pointers and reverse-hash
  * value required for lookup and traversal of the hash table.
  *
- * struct cds_lfht_node should be aligned on 4-bytes boundaries because
- * the two lower bits are used as flags.
+ * struct cds_lfht_node should be aligned on 8-bytes boundaries because
+ * the three lower bits are used as flags.
  *
  * struct cds_lfht_node can be embedded into a structure (as a field).
  * caa_container_of() can be used to get the structure from the struct
@@ -53,7 +53,7 @@ extern "C" {
 struct cds_lfht_node {
        struct cds_lfht_node *next;     /* ptr | BUCKET_FLAG | REMOVED_FLAG */
        unsigned long reverse_hash;
-} __attribute__((aligned(4)));
+} __attribute__((aligned(8)));
 
 /* cds_lfht_iter: Used to track state while traversing a hash chain. */
 struct cds_lfht_iter {
@@ -95,6 +95,19 @@ enum {
        CDS_LFHT_ACCOUNTING = (1U << 1),
 };
 
+struct cds_lfht_mm_type {
+       struct cds_lfht *(*alloc_cds_lfht)(unsigned long min_nr_alloc_buckets,
+                       unsigned long max_nr_buckets);
+       void (*alloc_bucket_table)(struct cds_lfht *ht, unsigned long order);
+       void (*free_bucket_table)(struct cds_lfht *ht, unsigned long order);
+       struct cds_lfht_node *(*bucket_at)(struct cds_lfht *ht,
+                       unsigned long index);
+};
+
+extern const struct cds_lfht_mm_type cds_lfht_mm_order;
+extern const struct cds_lfht_mm_type cds_lfht_mm_chunk;
+extern const struct cds_lfht_mm_type cds_lfht_mm_mmap;
+
 /*
  * _cds_lfht_new - API used by cds_lfht_new wrapper. Do not use directly.
  */
@@ -102,6 +115,7 @@ struct cds_lfht *_cds_lfht_new(unsigned long init_size,
                        unsigned long min_nr_alloc_buckets,
                        unsigned long max_nr_buckets,
                        int flags,
+                       const struct cds_lfht_mm_type *mm,
                        const struct rcu_flavor_struct *flavor,
                        pthread_attr_t *attr);
 
@@ -140,7 +154,7 @@ struct cds_lfht *cds_lfht_new(unsigned long init_size,
                        pthread_attr_t *attr)
 {
        return _cds_lfht_new(init_size, min_nr_alloc_buckets, max_nr_buckets,
-                       flags, &rcu_flavor, attr);
+                       flags, NULL, &rcu_flavor, attr);
 }
 
 /*
This page took 0.02446 seconds and 4 git commands to generate.