信号量函数down()和__down()是否相同?

时间:2014-03-23 20:33:21

标签: function linux-kernel semaphore

在信号量代码的向下功能中,第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);

Link to semaphore.c

1 个答案:

答案 0 :(得分:1)

  

信号量函数down()__down()是否相同?

不,他们不是。带有__前缀的函数供内部使用,通常不应在代码中使用。

仔细查看代码会发现down()是一个调用__down()并带有螺旋锁的函数,保护count的{​​{1}}部分。

仅当smaphore的计数为struct semaphore__down()委托给<= 0处理等待任务时才会调用函数__down()

所以你永远不想直接打电话给__down_common(),如果你这样做,你很可能会制造错误。