有没有什么安全的方法来完成目前等待完成的任务数量?

时间:2010-10-15 01:25:51

标签: linux-kernel

我有一个很好的内核编程任务,涉及一种新颖的内核锁定方法,我和我的团队选择将其作为完成包装器来实现。但是,规范要求我们返回由我们的方法通知的进程数,这涉及在我们的实现中返回由complete_all唤醒的进程数。

我们如何获得这个号码?这似乎足以用内部自旋锁锁定完成,计算元素数量,然后解锁它。这种方法是先发制人的,因为我们的函数是唯一能够访问所讨论的特定完成的函数。

那么,问题是:结构完成是不透明的吗?如果是的话,为了在中期季节及时完成作业,是否可以接受,忽略那种不透明性?或者,有没有办法做到这一点没有黑客攻击?

2 个答案:

答案 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_headwait_queue_head_t会让人感到困惑,即。双下划线表明你打算使用typedef。

我认为虽然你看错了方法。你说你需要知道complete_all()唤醒的进程数。该代码已经获取锁定并将进程列表唤醒,即。为了唤醒它们,为什么不让它返回醒来的进程数?