linux内核hash list

  1 #ifndef _LINUX_HLIST_H
  2 #define _LINUX_HLIST_H
  3
  4 /*
  5  * Double linked lists with a single pointer list head.
  6  * Mostly useful for hash tables where the two pointer list head is
  7  * too wasteful.
  8  * You lose the ability to access the tail in O(1).
  9  */
 10
 11 struct hlist_head {
 12     struct hlist_node *first;
 13 };
 14
 15 struct hlist_node {
 16     struct hlist_node *next, **pprev;
 17 };
 18
 19 #ifndef offsetof
 20 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
 21 #endif
 22
 23 #ifndef container_of
 24 /**
 25  * container_of - cast a member of a structure out to the containing structure
 26  * @ptr:    the pointer to the member.
 27  * @type:    the type of the container struct this is embedded in.
 28  * @member:    the name of the member within the struct.
 29  *
 30  */
 31 #define container_of(ptr, type, member) ({             32     const typeof(((type *)0)->member) * __mptr = (ptr);     33     (type *)((char *)__mptr - offsetof(type, member)); })
 34 #endif
 35
 36 #define HLIST_HEAD_INIT { .first = NULL }
 37 #define HLIST_HEAD(name) struct hlist_head name = {  .first = NULL }
 38 #define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL)
 39 static inline void INIT_HLIST_NODE(struct hlist_node *h)
 40 {
 41     h->next = NULL;
 42     h->pprev = NULL;
 43 }
 44
 45 static inline int hlist_unhashed(const struct hlist_node *h)
 46 {
 47     return !h->pprev;
 48 }
 49
 50 static inline int hlist_empty(const struct hlist_head *h)
 51 {
 52     return !h->first;
 53 }
 54
 55 static inline void __hlist_del(struct hlist_node *n)
 56 {
 57     struct hlist_node *next = n->next;
 58     struct hlist_node **pprev = n->pprev;
 59     *pprev = next;
 60     if (next)
 61         next->pprev = pprev;
 62 }
 63
 64 static inline void hlist_del(struct hlist_node *n)
 65 {
 66     __hlist_del(n);
 67     INIT_HLIST_NODE(n);
 68 }
 69
 70 static inline void hlist_del_init(struct hlist_node *n)
 71 {
 72     if (!hlist_unhashed(n)) {
 73         __hlist_del(n);
 74         INIT_HLIST_NODE(n);
 75     }
 76 }
 77
 78 static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
 79 {
 80     struct hlist_node *first = h->first;
 81     n->next = first;
 82     if (first)
 83         first->pprev = &n->next;
 84     h->first = n;
 85     n->pprev = &h->first;
 86 }
 87
 88 /* next must be != NULL */
 89 static inline void hlist_add_before(struct hlist_node *n,
 90                     struct hlist_node *next)
 91 {
 92     n->pprev = next->pprev;
 93     n->next = next;
 94     next->pprev = &n->next;
 95     *(n->pprev) = n;
 96 }
 97
 98 static inline void hlist_add_after(struct hlist_node *n,
 99                     struct hlist_node *next)
100 {
101     next->next = n->next;
102     n->next = next;
103     next->pprev = &n->next;
104
105     if(next->next)
106         next->next->pprev  = &next->next;
107 }
108
109 /* after that we‘ll appear to be on some hlist and hlist_del will work */
110 static inline void hlist_add_fake(struct hlist_node *n)
111 {
112     n->pprev = &n->next;
113 }
114
115 /*
116  * Move a list from one list head to another. Fixup the pprev
117  * reference of the first entry if it exists.
118  */
119 static inline void hlist_move_list(struct hlist_head *old,
120                    struct hlist_head *new)
121 {
122     new->first = old->first;
123     if (new->first)
124         new->first->pprev = &new->first;
125     old->first = NULL;
126 }
127
128 #define hlist_entry(ptr, type, member) container_of(ptr,type,member)
129
130 #define hlist_for_each(pos, head) 131     for (pos = (head)->first; pos ; pos = pos->next)
132
133 #define hlist_for_each_safe(pos, n, head) 134     for (pos = (head)->first; pos && ({ n = pos->next; 1; }); 135          pos = n)
136
137 /**
138  * hlist_for_each_entry    - iterate over list of given type
139  * @tpos:    the type * to use as a loop cursor.
140  * @pos:    the &struct hlist_node to use as a loop cursor.
141  * @head:    the head for your list.
142  * @member:    the name of the hlist_node within the struct.
143  */
144 #define hlist_for_each_entry(tpos, pos, head, member)             145     for (pos = (head)->first;                     146          pos &&                             147         ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); 148          pos = pos->next)
149
150 /**
151  * hlist_for_each_entry_continue - iterate over a hlist continuing after current point
152  * @tpos:    the type * to use as a loop cursor.
153  * @pos:    the &struct hlist_node to use as a loop cursor.
154  * @member:    the name of the hlist_node within the struct.
155  */
156 #define hlist_for_each_entry_continue(tpos, pos, member)         157     for (pos = (pos)->next;                         158          pos &&                             159         ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); 160          pos = pos->next)
161
162 /**
163  * hlist_for_each_entry_from - iterate over a hlist continuing from current point
164  * @tpos:    the type * to use as a loop cursor.
165  * @pos:    the &struct hlist_node to use as a loop cursor.
166  * @member:    the name of the hlist_node within the struct.
167  */
168 #define hlist_for_each_entry_from(tpos, pos, member)             169     for (; pos &&                             170         ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); 171          pos = pos->next)
172
173 /**
174  * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry
175  * @tpos:    the type * to use as a loop cursor.
176  * @pos:    the &struct hlist_node to use as a loop cursor.
177  * @n:        another &struct hlist_node to use as temporary storage
178  * @head:    the head for your list.
179  * @member:    the name of the hlist_node within the struct.
180  */
181 #define hlist_for_each_entry_safe(tpos, pos, n, head, member)          182     for (pos = (head)->first;                     183          pos && ({ n = pos->next; 1; }) &&                  184         ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); 185          pos = n)
186
187 #endif
时间: 2024-10-19 05:26:53

linux内核hash list的相关文章

Linux内核哈希表中的bucket桶

哈希表 哈希表(Hashtable)又称为“散列”,Hashtable是会根据索引键的哈希程序代码组织成的索引键(Key)和值(Value)配对的集合.Hashtable 对象是由包含集合中元素的哈希桶(Bucket)所组成的.而Bucket是Hashtable内元素的虚拟子群组,可以让大部分集合中的搜寻和获取工作更容易.更快速. 哈希函数(Hash Function)为根据索引键来返回数值哈希程序代码的算法.索引键(Key)是被存储对象的某些属性值(Value).当对象加入至 Hashtabl

linux内核netfilter连接跟踪的hash算法

linux内核中的netfilter是一款强大的基于状态的防火墙,具有连接跟踪(conntrack)的实现.conntrack是netfilter的核心,许多增强的功能,例如,地址转换(NAT),基于内容的业务识别(l7, layer-7 module)都是基于连接跟踪.然而,netfilter的性能还有很多值得改进的地方. netfilter的连接跟踪的hash算法是在Bob Jenkins的lookup2.c基础上的改进实现,Bob Jenkins已经推出lookup3.c的实现,见地址:h

Linux内核剖析 之 进程简介

1.概念 1.1  什么是进程? 进程是程序执行的一个实例,可以看作充分描述程序已经执行到何种程度的数据结构的汇集. 从内核观点看,进程的目的就是担当分配系统资源(CPU时间,内存等)的实体. 我们熟悉的fork()库函数,它有两种用法: (1).一个父进程希望复制自己,使父子进程执行不同的代码段,常用于网络服务程序. (2).一个进程要执行一个不同的程序,fork()后立即exec(),如shell. 1.2  什么是线程? 有时候,一个进程希望有多个执行流,如一款麻将游戏,三个由电脑控制的人

Linux Kernel - Debug Guide (Linux内核调试指南 )

http://blog.csdn.net/blizmax6/article/details/6747601 linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 建立调试环境 发行版的选择和安装 安装交叉编译工具 bin工具集的使用 qemu的使用 initrd.img的原理与制作 x86虚拟调试环境的建立 arm虚拟调试环境的建立 arm开发板调试环

linux内核分析之内存管理

1.struct page 1 /* Each physical page in the system has a struct page associated with 2 * it to keep track of whatever it is we are using the page for at the 3 * moment. Note that we have no way to track which tasks are using 4 * a page, though if it

《Linux内核分析》第六周学习笔记

<Linux内核分析>第六周学习笔记 进程的描述和创建 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [学习视频时间:1小时 撰写博客时间:2小时] [学习内容:进程创建的过程.使用gdb跟踪分析内核处理函数sys_clone] 一.进程的描述 1.1 进程描述符task_struct数据结构(一) 1. 进程控制块PCB——task_struct 为了管理进程,内核

Linux内核设计第三周——构造一个简单的Linux系统

Linux内核设计第三周 ——构造一个简单的Linux系统 一.知识点总结 计算机三个法宝: 存储程序计算机 函数调用堆栈 中断 操作系统两把宝剑: 中断上下文的切换 进程上下文的切换 linux内核源代码分析 arch/目录保存支持多种CPU类型的源代码 其中的关键目录包括:Documentation.drivers.firewall.fs(文件系统).include init目录:含有main.c,内核启动相关的代码基本都在init目录下 start_kernal()函数为启动函数,初始化内

Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 【转】

原文地址:Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinaunix.net/uid-25909619-id-4938390.html 在构架相关的汇编代码运行完之后,程序跳入了构架无关的内核C语言代码:init/main.c中的start_kernel函数,在这个函数中Linux内核开始真正进入初始化阶段, 下面我就顺这代码逐个函数的解释,但是这里并不会过于深入

Linux内核中的哈希表

Author:tiger-john Time:2012-12-20mail:[email protected]Blog:http://blog.csdn.net/tigerjb/article/details/8450995 转载请注明出处. 前言: 1.基本概念: 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做散列表.