您的位置:首页 > 其它

内核同步机制API之up

2018-02-27 09:16 267 查看
void up(struct semaphore *sem)函数用于释放一个信号量,一般和down系列函数搭配使用
其源码分析如下:
void up(struct semaphore *sem)
{
unsigned long flags;
#这里可以明显看到semaphore 实现中有调用spinlock来保护
raw_spin_lock_irqsave(&sem->lock, flags);
#正常情况下down之后sem->wait_list 肯定不为空
if (likely(list_empty(&sem->wait_list)))
sem->count++;
else
#如果sem->wait_list 为null,则调用__up函数
__up(sem);
raw_spin_unlock_irqrestore(&sem->lock, flags);
}
static noinline void __sched __up(struct semaphore *sem)
{
struct semaphore_waiter *waiter = list_first_entry(&sem->wait_list,
struct semaphore_waiter, list);
list_del(&waiter->list);
waiter->up = true;
wake_up_process(waiter->task);
}
可以看到up函数首先删除waiter->list,然后通过wakup_up_process 来欢迎形参的task
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: