- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在将遗留代码从 Linux 3.14 移植到 4.1。我需要将许多对 sleep_on()
函数的调用转换为对 wait_event()
函数的调用:
wait_event(wq, condition);
wait_event_interruptible(wq, condition);
wait_event_timeout(wq, condition, timeout);
wait_event_interruptible_timeout(wq, condition, timeout);
sleep_on()
函数在内核 3.15 中被删除,因为它们会导致竞争条件。
我的问题是理解使用 sleep_on()
函数的棘手代码并进行适当的更改、测试等需要花费很多时间,我需要至少发布一个原型(prototype)尽快地。假设我是 Linux 设备驱动程序新手。
您知道我可以使用一种模式来通过调用 wait_event()
函数来替换对 sleep_on()
函数的调用吗?例如,如果我只是将 sleep_on(&wait_queue)
替换为 wait_event(wait_queue, false)
,与遗留代码相比会有什么影响?结果会和遗留代码一样糟糕(可能有竞争条件),还是更糟?
提前感谢您的建议。
最佳答案
您可以定义 sleep_on
函数,因为它已在 3.15 之前的内核中定义。像这样:
void
sleep_on(wait_queue_head_t *q)
{
unsigned long flags;
wait_queue_t wait;
init_waitqueue_entry(&wait, current);
__set_current_state(TASK_UNINTERRUPTIBLE);
spin_lock_irqsave(&q->lock, flags);
__add_wait_queue(q, &wait);
spin_unlock(&q->lock);
schedule();
spin_lock_irq(&q->lock);
__remove_wait_queue(q, &wait);
spin_unlock_irqrestore(&q->lock, flags);
}
(源自 sleep_on_common
的代码,但删除了超时内容。)
对于那些想在 kernel.org 上查看原始代码的人,请参阅 sleep_on_common()
以及 2014 年 4 月提交的 32d01dc7be4e725ab85ce1d74e8f4adc02ad68dd
(在该功能被删除前几天) ).
至于wait_event()
和 friend ,使用constant condition是错误的:
关于linux - 从 sleep_on() 到 wait_event()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44852140/
我正在将遗留代码从 Linux 3.14 移植到 4.1。我需要将许多对 sleep_on() 函数的调用转换为对 wait_event() 函数的调用: wait_event(wq, conditi
我是一名优秀的程序员,十分优秀!