200static __inline__ void d_add(struct dentry * entry, struct inode *inode) 201{ 202 d_instantiate(entry, inode); //将dentry与inode挂钩(是内存中的吗) 203 d_rehash(entry); //将dentry挂入内存中的某个队列 204} 函数d_instantiate()使得dentry结构和inode结构互相挂钩,代码在fs/dcache.c中: ...
list_entry()中用到了函数container_of(): #definecontainer_of(ptr, type, member) ({ \consttypeof( ((type *)0)->member ) *__mptr =(ptr); \ (type*)( (char*)__mptr - offsetof(type,member) );}) 其中又用到了offsetof()函数: #defineoffset_of(type, memb) \((unsignedlong)(&((t...
list_entry函数描述 #definelist_entry(ptr,type,member)\ ((type*)((char*)(ptr)-(unsignedlong)(&((type*)0)->member))) 这个倒是不难理解:从一个结构的成员指针找到其容器的指针。 下面我们逐步分析这个宏是怎么展开的,以list_entry(list,structtask_struct,sibling)为例: 预处理后是((task_...
list_entry函数:和container_of函数一样 代码: #define list_entry(ptr, type, member) \ container_of(ptr, type, member)
list_first_entry_or_null函数用于在链表中查找第一个符合条件的元素。它接受两个参数:一个链表指针和一个条件。如果链表中存在符合条件的元素,则返回该元素的指针;否则返回NULL。 三、使用方法 在使用list_first_entry_or_null时,需要传递一个链表指针和一个条件作为参数。具体的使用方法如下: 1. 包含相关头文件...
list_for_each_entry被预定义为一个for循环语句,for循环的第一句获取(head)->next指向的member成员的结构体指针,将pos初始化为链表中出链表头之外的第一个实体链表成员,for的第三句通过pos->member.next指针遍历整个实体链表,当pos->member.next再次指向链表头的时候,说明已经遍历完毕,退出循环。
ReadListEntry函数从目标的内存中读取双链接列表条目。 语法 C++ ULONGReadListEntry( ULONG64 Address, PLIST_ENTRY64 List ); 参数 Address 指定目标中列表项的地址。 如果目标使用 32 位指针,则此地址应为LIST_ENTRY32结构的地址。 如果目标使用 64 位指针,则此地址应为LIST_ENTRY64结构的地址。
一、list_for_each_entry_safe基本用法 list_for_each_entry_safe数由C言中的宏定义构成,它有三个参数:pos,n,head。其中,head指向头节点的指针,pos n指向遍历节点的指针,每次循环时,pos是指向当前节点,而n是指向下一个要遍历的节点。 list_for_each_entry_safe数的典型用法如下: struct list_head *head;tt...
list是新队列的head指针, 包括的元素从原head队列的第一个元素到entry, head队列仅包括余下的元素 代码语言:javascript 复制 static inline void __list_cut_position(struct list_head *list, struct list_head *head, struct list_head *entry) { struct list_head *new_first = entry->next; list->next...
具体的函数接口这里就不介绍了,RTThread的API文档里讲的很清楚,按照API接口调用就可以了,比较容易。 这里主要说明rt_list_for_each_entry宏的用法,因为每次就这里不太好理解,这个宏实现的功能类似C++中用引用遍历链表,很好用的。而且RTT已经给实现了这种遍历方法如果不用总感觉自己亏了点啥 ...