注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

火车的家

Put first thing first

 
 
 

日志

 
 

2016.05.28 linux kernel list 用法  

2016-05-28 21:37:20|  分类: linux kernel |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
假设有如下结构体:
struct track_info {
        struct list_head link;
        void *addr;
       long caller;
};

1. 声明链表头:
LIST_HEAD(mem_stats);

2. 添加一个节点:
struct track_info *info = kzalloc(sizeof(*info), GFP_KERNEL);
info->addr = addr;
info->caller = caller;
list_add_tail(&info->link, &mem_stats);

3. 释放指定节点:
struct track_info *e, *tmp_e;
list_for_each_entry_safe(e, tmp_e, &mem_stats, link) {
         if ( e->addr == addr ) {
                 list_del(&e->link);
                 break;
         }
}
注意,list_del就可以直接释放在第2步分配的内存,不需要再call kfree。还有,这里需要用list_for_each_entry_safe遍历链表,因为要做删除操作,用list_for_each_entry的话,会break链表。

4. 遍历
struct track_info *e_caller;
list_for_each_entry(e_caller, &mem_stats, link) {
        if ( e_caller->caller == 0x1234 ) {
                count++;
         }
}
  评论这张
 
阅读(24)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017