在信号量代码的向下功能中,第53行有两个函数down(struct semaphore *sem)
,第61行有__down(sem)
。
在else部分中,我们以递归的方式在第53行调用down。
void down(struct semaphore *sem)
{
unsigned long flags;
raw_spin_lock_irqsave(&sem->lock, flags);
if (likely(sem->count > 0))
sem->count--;
else
__down(sem);
raw_spin_unlock_irqrestore(&sem->lock, flags);
}
EXPORT_SYMBOL(down);
答案 0 :(得分:1)
信号量函数
down()
和__down()
是否相同?
不,他们不是。带有__
前缀的函数供内部使用,通常不应在代码中使用。
仔细查看代码会发现down()
是一个调用__down()
并带有螺旋锁的函数,保护count
的{{1}}部分。
仅当smaphore的计数为struct semaphore
,__down()
委托给<= 0
处理等待任务时才会调用函数__down()
。
所以你永远不想直接打电话给__down_common()
,如果你这样做,你很可能会制造错误。