我有一个很好的内核编程任务,涉及一种新颖的内核锁定方法,我和我的团队选择将其作为完成包装器来实现。但是,规范要求我们返回由我们的方法通知的进程数,这涉及在我们的实现中返回由complete_all唤醒的进程数。
我们如何获得这个号码?这似乎足以用内部自旋锁锁定完成,计算元素数量,然后解锁它。这种方法是先发制人的,因为我们的函数是唯一能够访问所讨论的特定完成的函数。
那么,问题是:结构完成是不透明的吗?如果是的话,为了在中期季节及时完成作业,是否可以接受,忽略那种不透明性?或者,有没有办法做到这一点没有黑客攻击?
答案 0 :(得分:2)
您可能只想更改__wake_up_common
,以便返回已唤醒的任务数,然后修改complete_all
以返回相同的数字。
让手机面朝上和放松。
顺便说一句,不透明的结构将有typedef struct whatever whatever_t
,如atomic_t
。那些是不透明的。
尼科。
答案 1 :(得分:1)
严格来说,它不是不透明的,即。它在标题中定义,但你知道。
作者可能希望它是不透明的,但为了允许静态内联对其进行操作而将其交换为公共定义。这在内核代码中很常见,因为你更关注速度和速度。代码大小比严格的API - 毕竟它都是内核代码。
我明白了:
struct completion {
unsigned int done;
wait_queue_head_t wait;
};
所以大多数有趣的位实际上都在wait_queue_head_t
,这是struct __wait_queue_head
的typedef。
双重下划线可能表示作者认为它是私密的,或者他们只是认为拥有struct wait_queue_head
和wait_queue_head_t
会让人感到困惑,即。双下划线表明你打算使用typedef。
我认为虽然你看错了方法。你说你需要知道complete_all()
唤醒的进程数。该代码已经获取锁定并将进程列表唤醒,即。为了唤醒它们,为什么不让它返回醒来的进程数?