/***********************************
文件名:kernel link list of linux.h
作者:Bumble Bee
日期:2015-1-31
功能:移植linux内核链表
************************************/
/*链表结点数据结构*/
structlist_head
{struct list_head *next, *prev;
};/***********************************
函数名: INIT_LIST_HEAD
参数: 指向list_head结构体的指针
返回值: 无
函数功能:通过将前向指针和后向指
针指向自己来创建一个链表表
头
***********************************/
static inline void INIT_LIST_HEAD(struct list_head *list)
{
list->next =list;
list->prev =list;
}/***********************************
函数名: __list_add
参数: @new:要插入结点的指针域
@prev:前一个节点的指针域
@next:后一个节点的指针域
返回值: 无
函数功能:在两个已知节点中插入新节点
***********************************/
static inline void __list_add(struct list_head *new,struct list_head *prev, struct list_head *next)
{
next->prev = new;new->next =next;new->prev =prev;
prev->next = new;
}extern void __list_add(struct list_head *new,struct list_head *prev, struct list_head *next);/**************************************
函数名: list_add
参数: @new:要插入结点的指针域
@head:要插入链表表头的指针域
返回值: 无
函数功能:在已知链表头部插入新节点
**************************************/
static inline void list_add(struct list_head *new, struct list_head *head)
{
__list_add(new, head, head->next);
}/**************************************
函数名: list_add_tail
参数: @new:要插入结点的指针域
@head:要插入链表表头的指针域
返回值: 无
函数功能:在已知链表尾部插入新节点
**************************************/
static inline void list_add_tail(struct list_head *new, struct list_head *head)
{
__list_add(new, head->prev, head);
}/*************************************
函数名: list_for_each
参数: @pos:遍历链表的光标
@head:要遍历链表的表头
返回值: 无
函数功能:实质为一个for循环,遍历链表
*************************************/
#define list_for_each(pos, head) for (pos = (head)->next;pos !=(head); pos= pos->next)/*************************************************
函数名: list_entry
参数: @ptr:节点中list_head的地址
@type:节点的类型
@member:list_head 在结构体中成员的名字
返回值: 节点的地址,已被强制转化为type型指针
函数功能:将节点最低位置假设为0,此时取成员member
的地址即为offset,再用list_head的地址将
offset减去即为节点的地址
**************************************************/
#define list_entry(ptr, type, member) \container_of(ptr, type, member)#define container_of(ptr, type, member) ({ const typeof(((type *)0)->member) * __mptr =(ptr); (type*)((char *)__mptr -offsetof(type, member)); })#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
static inline void __list_del(struct list_head *prev, struct list_head *next)
{
next->prev =prev;
prev->next =next;
}static inline void list_del(struct list_head *entry)
{
__list_del(entry->prev, entry->next);
}