On Wed, 28 Aug 2019 14:51:49 +0800 Bing Zhao <bi...@mellanox.com> wrote:
> + > +/** Node element structure on the LIST of the link */ > +struct rte_hlist_node_entry { > + LIST_ENTRY(rte_hlist_node_entry) next; /**< Next element pointer. */ > + /**< Data element inside this noed. */ > + struct rte_hlist_data_element d; > + char key[]; /**< Copied and stored key. */ > +}; > + > +/** Head of all the nodes with the same hash value */ > +struct rte_hlist_head_entry { > + LIST_HEAD(, rte_hlist_node_entry) head; /**< Head for each hash list. */ > + /**< Current items in the list. */ > + uint16_t entries_in_bucket; > + /**< Shift number for extension */ > + uint16_t bucket_shift; > +}; > + > +/** The hlist table structure. */ > +struct rte_hlist_table { > + char name[RTE_HLIST_NAMESIZE]; /**< Name of the hash. */ > + uint32_t entries; /**< Total number of entries. */ > + uint32_t entries_per_bucket; /**< Number of entries in a list. */ > + /**< Number of entries with data from customer. */ > + uint32_t custom_entries; > + uint16_t key_len; /**< Length of the key. */ > + /**< Shift number of the whole table. */ > + uint16_t bucket_shift; > + /**< To find which list the key is in. */ > + uint32_t bucket_mask; > + rte_hlist_calc_fn hash_func; /**< The hash function to calcuate. */ > + /**< The function to free the custom data. */ > + rte_hlist_free_fn free_func; > + uint32_t init_val; /**< For initializing hash function. */ > + /**< Reserved for fast shrinking of the table. */ > + char *map; You probably should use void * for that. > + /**< A flat and extendible table of all lists. */ > + struct rte_hlist_head_entry *t; > +}; > + Since API/ABI considerations are important. You will save yourself a lot of pain if these structures can be made private and only part of rte_hlist.c.