找回密码
 立即注册
搜索
查看: 1495|回复: 6

[软件] 请教个linux源码的问题

[复制链接]
     
发表于 2024-6-29 17:16 | 显示全部楼层 |阅读模式
在看3.x中的sysctl.c这部分代码,有个函数看不懂


  1. /* see if attaching q to p would be an improvement */
  2. static void try_attach(struct ctl_table_header *p, struct ctl_table_header *q)
  3. {
  4.         struct ctl_table *to = p->ctl_table, *by = q->ctl_table;
  5.         struct ctl_table *next;
  6.         int is_better = 0;
  7.         int not_in_parent = !p->attached_by;

  8.         while ((next = is_branch_in(by, to)) != NULL) {
  9.                 if (by == q->attached_by)
  10.                         is_better = 1;
  11.                 if (to == p->attached_by)
  12.                         not_in_parent = 1;   《---- 这里为什么不添加个判断 if (is_better && not_in_parent)  就break; 提前结束循环
  13.                 by = by->child;
  14.                 to = next->child;
  15.         }

  16.         if (is_better && not_in_parent) {
  17.                 q->attached_by = by;
  18.                 q->attached_to = to;
  19.                 q->parent = p;
  20.         }
  21. }
复制代码


另外,网络上关于sysctl这部分代码分析没有看见,有疑问不知道找谁交流,直接问源代码作者吗,
回复

使用道具 举报

头像被屏蔽
     
发表于 2024-6-29 17:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2024-6-29 17:51 来自手机 | 显示全部楼层
因为要继续遍历链表到头?下面有赋值

— from Xiaomi 23127PN0CC, Android 14 of S1 Next Goose v2.5.2-play
回复

使用道具 举报

     
发表于 2024-6-29 17:57 | 显示全部楼层
先看最新版本有没有改这边的逻辑吧,说不定别人也觉得可以提前终止循环
回复

使用道具 举报

     
发表于 2024-6-29 18:36 | 显示全部楼层
可能是循环里有两层if 不利于优化?
回复

使用道具 举报

发表于 2024-6-29 19:06 | 显示全部楼层
没看懂你的改法,但 is_better && not_in_parent 显然不是while结束的条件
这里while结束的条件是is_branch_in函数返回值空
回复

使用道具 举报

发表于 2024-6-29 19:54 | 显示全部楼层
虽然is_better 和 not_in_parent一旦赋值为1就不会变回去,但是最后的
  1.                 q->attached_by = by;
  2.                 q->attached_to = to;
复制代码

用到的是循环到最后的by和to,提前break的话显然语义不同了吧。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-11-9 05:03 , Processed in 0.051270 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表