linux内核之container_of

semaphore的释放操作代码如下

static noinline void __sched __up(struct semaphore *sem)
{
	//拿到sem等待链表中的第一个节点,对应的semaphore_waiter,线程描述符存放在那个里面
        struct semaphore_waiter *waiter = list_first_entry(&sem->wait_list,
						struct semaphore_waiter, list);
	//从sem等待链表中摘除
        list_del(&waiter->list);
	//置up标志,使waier->task的__down_common for(;;){}循环退出,开始继续执行
        waiter->up = true;
	wake_up_process(waiter->task);
}

其中semaphore,semaphore_waiter,list_head结构如下

struct semaphore {
	raw_spinlock_t		lock;
	unsigned int		count;
	struct list_head	wait_list;
};

struct semaphore_waiter {
	struct list_head list;
	struct task_struct *task;
	bool up;
};


struct list_head {
	struct list_head *next, *prev;
};

这里面list_head就是一个双向链表的作用,就像串起珠子的线。这个线可以串任何需要串的东西,比如珠子,铜钱,贝壳……

list_head内部是用指针来串的,而在semaphore和semophore_waiter里面不是指针,这样的设计实现了刚开始那个__up()中反向查找的功能。就是根据waiter的list_head成员得到相应waiter的过程。方法就是,根据waiter中list的地址,以及list在waiter中的偏移,算出waiter的起始地址。我感觉这样的设计很巧妙。

container_of宏的具体实现分析这里很详细——https://blog.csdn.net/npy_lp/article/details/7010752

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值