1#ifndef __LINUX_HASHTABLE_H__
2#define __LINUX_HASHTABLE_H__
28#include <linux/kernel.h>
39#define INIT_HLIST_HEAD(head) do { (head)->first = 0; } while (0)
40#define INIT_HLIST_NODE(node) do { (node)->next = 0; (node)->pprev = 0; } while (0)
52static inline void hlist_del(
struct hlist_node* n)
67static inline int hlist_unhashed(
const struct hlist_node* n)
72#define hlist_entry(ptr, type, member) container_of(ptr, type, member)
74#define hlist_entry_safe(ptr, type, member) \
75 ((ptr) ? hlist_entry(ptr, type, member) : (type*)0)
77#define hlist_for_each_entry(pos, head, member) \
78 for (pos = hlist_entry_safe((head)->first, typeof(*pos), member); \
80 pos = hlist_entry_safe((pos)->member.next, typeof(*pos), member))
82#define DECLARE_HASHTABLE(name, bits) struct hlist_head name[1 << (bits)]
83#define DEFINE_HASHTABLE(name, bits) DECLARE_HASHTABLE(name, bits)
85#define HASH_BITS(name) ((int)__builtin_ctz(sizeof(name) / sizeof(*(name))))
88#define hash_min(key, bits) ((unsigned int)(key) & ((1u << (bits)) - 1u))
90#define hash_add(hashtable, node, key) \
91 hlist_add_head(node, &hashtable[hash_min(key, HASH_BITS(hashtable))])
93#define hash_del(node) hlist_del(node)
95#define hash_empty(hashtable) __hash_empty(hashtable, HASH_BITS(hashtable))
97static inline int __hash_empty(
struct hlist_head* ht,
unsigned int bits)
100 for (i = 0; i < (1u << bits); i++)
106#define hash_for_each_possible(name, obj, member, key) \
107 hlist_for_each_entry(obj, \
108 &name[hash_min((unsigned int)(key), HASH_BITS(name))], member)
110#define hash_for_each_safe(name, bkt, tmp, obj, member) \
111 for ((bkt) = 0, (obj) = 0; (bkt) < (1u << HASH_BITS(name)) && \
112 (((obj) = hlist_entry_safe(name[bkt].first, typeof(*obj), member)), 1); \
116#define hash_for_each_possible_safe(name, obj, tmp, key, member) \
117 hlist_for_each_entry_safe(obj, tmp, \
118 &name[hash_min((unsigned int)(key), HASH_BITS(name))], member)
120#define hlist_for_each_entry_safe(pos, n, head, member) \
121 for (pos = hlist_entry_safe((head)->first, typeof(*pos), member); \
122 pos && ({ n = pos->member.next; 1; }); \
123 pos = hlist_entry_safe(n, typeof(*pos), member))
int h
Definition layout.c:118
Definition hashtable.h:35
struct hlist_node * first
Definition hashtable.h:36
Definition hashtable.h:30
struct hlist_node ** pprev
Definition hashtable.h:32
struct hlist_node * next
Definition hashtable.h:31