免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1635 | 回复: 3
打印 上一主题 下一主题

[内存管理] 奇怪的代码 [复制链接]

论坛徽章:
1
白羊座
日期:2013-08-22 17:30:33
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-10-06 11:23 |只看该作者 |倒序浏览
本帖最后由 cjdao 于 2013-10-06 11:31 编辑

下面的代码是linux内核内存管理初始化时的一个函数,感觉zone_type这个变量的操作有点奇怪。
/*
* Builds allocation fallback zone lists.
*
* Add all populated zones of a node to the zonelist.
*/
static int build_zonelists_node(pg_data_t *pgdat, struct zonelist *zonelist,
                                int nr_zones, enum zone_type zone_type)
{
        struct zone *zone;

        BUG_ON(zone_type >= MAX_NR_ZONES);
        zone_type++;

        do {
                zone_type--;
                zone = pgdat->node_zones + zone_type;
                if (populated_zone(zone)) {
                        zoneref_set_zone(zone,
                                &zonelist->_zonerefs[nr_zones++]);
                        check_highest_zone(zone_type);
                }

        } while (zone_type);
        return nr_zones;
}

改写如下不是更好理解么,哪位可以指点一下上面的代码是不是有什么深层次的原因呢
static int build_zonelists_node(pg_data_t *pgdat, struct zonelist *zonelist,
                                int nr_zones, enum zone_type zone_type)
{
        struct zone *zone;

        BUG_ON(zone_type >= MAX_NR_ZONES);
        //zone_type++;
        do {
                //zone_type--;
                zone = pgdat->node_zones + zone_type;
                if (populated_zone(zone)) {
                        zonelist->zones[nr_zones++] = zone;
                        check_highest_zone(zone_type);
                }
                zone_type--;
        } while (zone_type);
        return nr_zones;
}



论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
2 [报告]
发表于 2013-10-06 12:36 |只看该作者
If the code is written as you imagined, when the 'zone_type' parameter is passed as 0(enum,right? it could be treated as int), the do_while loop will be a deadloop.

论坛徽章:
1
白羊座
日期:2013-08-22 17:30:33
3 [报告]
发表于 2013-10-07 07:49 |只看该作者
thanks 回复 2# firkraag


   

论坛徽章:
0
4 [报告]
发表于 2013-10-07 10:15 |只看该作者
git log 一下发现本来是和楼主改的差不多的,后来zone_type改成enum后不得不改成这副蹩脚的样子了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP